fix cut points of UTF-8 strings

avinationmerge
UbitUmarov 2015-10-28 21:27:56 +00:00
parent 114ac59314
commit 45ff7cec80
1 changed files with 28 additions and 10 deletions

View File

@ -1945,17 +1945,26 @@ namespace OpenSim.Framework
/// <returns></returns> /// <returns></returns>
public static byte[] StringToBytes256(string str) public static byte[] StringToBytes256(string str)
{ {
if (String.IsNullOrEmpty(str)) { return Utils.EmptyBytes; } if (String.IsNullOrEmpty(str))
if (str.Length > 254) str = str.Remove(254); return Utils.EmptyBytes;
if (!str.EndsWith("\0")) { str += "\0"; }
if (!str.EndsWith("\0"))
str += "\0";
// Because this is UTF-8 encoding and not ASCII, it's possible we // Because this is UTF-8 encoding and not ASCII, it's possible we
// might have gotten an oversized array even after the string trim // might have gotten an oversized array even after the string trim
byte[] data = UTF8.GetBytes(str); byte[] data = UTF8.GetBytes(str);
if (data.Length > 256) if (data.Length > 256)
{ {
Array.Resize<byte>(ref data, 256); int cut = 255;
data[255] = 0; if((data[cut] & 0x80 ) != 0 )
{
while(cut > 0 && (data[cut] & 0xc0) != 0xc0)
cut--;
}
Array.Resize<byte>(ref data, cut + 1);
data[cut] = 0;
} }
return data; return data;
@ -1987,17 +1996,26 @@ namespace OpenSim.Framework
/// <returns></returns> /// <returns></returns>
public static byte[] StringToBytes1024(string str) public static byte[] StringToBytes1024(string str)
{ {
if (String.IsNullOrEmpty(str)) { return Utils.EmptyBytes; } if (String.IsNullOrEmpty(str))
if (str.Length > 1023) str = str.Remove(1023); return Utils.EmptyBytes;
if (!str.EndsWith("\0")) { str += "\0"; }
if (!str.EndsWith("\0"))
str += "\0";
// Because this is UTF-8 encoding and not ASCII, it's possible we // Because this is UTF-8 encoding and not ASCII, it's possible we
// might have gotten an oversized array even after the string trim // might have gotten an oversized array even after the string trim
byte[] data = UTF8.GetBytes(str); byte[] data = UTF8.GetBytes(str);
if (data.Length > 1024) if (data.Length > 1024)
{ {
Array.Resize<byte>(ref data, 1024); int cut = 1023;
data[1023] = 0; if((data[cut] & 0x80 ) != 0 )
{
while(cut > 0 && (data[cut] & 0xc0) != 0xc0)
cut--;
}
Array.Resize<byte>(ref data, cut + 1);
data[cut] = 0;
} }
return data; return data;