首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

在XE4停,一个汉字占用一个字节,好不习惯?求详解

2013-12-30 
在XE4下,一个汉字占用一个字节,好不习惯?求详解在XE4中,一个汉字变成了1个字节,是样有些不习惯,怎么能设置

在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() 获取的长度吧.
[解决办法]

引用:
UnicodeString 中放的是 双字节的 unicode字符串,每个字符占两个字节,字符串用0(两字节)结束。

与 AnsiString 的单字节不同,AnsiString 可以看成是不含0的字节流,而UnicodeString不行。AnsiSting 转 UnicodeString ,其中发生了代码页转换,是一个不可逆的过程,再转回来就可能错了。虽然我们也这样做,但这是不安全的。

  char buff[128];
  UnicodeToUtf8(buff,L"汉字一大堆,为什么乱码",128);
  //AnsiString astr = buff ;
  UTF8String 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就不行了,它里面的字符串是要符合指定的代码页规则。

。。。
[解决办法]
UnicodeString AnsiString可以完美转换
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,没有截断

热点排行