在XE4下,一个汉字占用一个字节,好不习惯?求详解
在XE4中,一个汉字变成了1个字节,是样有些不习惯,怎么能设置成让其占用2个字节呢?
[解决办法]
开什么玩笑呢,一个汉字是两个字节。
楼主是如何知道“一个汉字变成了1个字节”的?
默认的String是UnicodeString,用AnsiString就行了。
[解决办法]
UnicodeString 中放的是 双字节的 unicode字符串,每个字符占两个字节,字符串用0(两字节)结束。
与 AnsiString 的单字节不同,AnsiString 可以看成是不含0的字节流,而UnicodeString不行。AnsiSting 转 UnicodeString ,其中发生了代码页转换,是一个不可逆的过程,再转回来就可能错了。虽然我们也这样做,但这是不安全的。
char buff[128];
UnicodeToUtf8(buff,L"汉字一大堆,为什么乱码",128);
AnsiString astr = buff ;
UnicodeString tmp = astr ; //将这两行注释掉
astr = tmp; //就不会有乱码了。
wchar_t ustr[128];
Utf8ToUnicode(ustr,astr.c_str(),128);
UnicodeString R= ustr ;
ShowMessage(R);//看到乱码了吧
通过这个例子,可以多了解一下 双字节unicode字符串与单字节字符串之间的差别。
AnsiString 是单字节,可以安全存放 UFT8 及其他任意编码的字符,而UnicodeString就不行了,它里面的字符串是要符合指定的代码页规则。
[解决办法]
楼主指的不会是 .length() 获取的长度吧.
[解决办法]
AnsiString XX = "中ABCDEFG\0===国";
ShowMessage(XX);
Caption = XX.Length(); // 长度9,\0被截断
XX.SetLength(19);
CopyMemory(XX.c_str(), "中ABCDEFG\0===国", 15);
ShowMessage(XX);
Caption = XX.Length(); // 长度19,没有截断
UnicodeString YY = XX; // 转换
ShowMessage(YY);
Caption = YY.Length(); // 长度17,没有截断
XX = YY; // 回来
ShowMessage(XX);
Caption = XX.Length(); // 长度19,没有截断