Unicode转换问题

时间:2011-12-21 09:41:58

标签: c++ unicode c++builder

这是关于Unicode的初学者问题。我正在使用Embarcadero C ++ Builder 2009,他们应该将默认字符串更改为使用Unicode。

  • 我在源代码编辑器中输入了各种符号,这些符号不属于标准的“7位ASCII”。
  • 我的程序正在使用C ++ Builder的String类型来获取用户输入。
  • 我也通过将值设置为wchar_t来手动添加输入。

似乎解释符号的方式存在冲突。有时我得到一个符号,例如代码0x00C7('Ç'),但有时相同的符号被编码为0xFFC7,例如在源代码编辑器中。据我了解,前者是正确的Unicode,后者是“别的东西”。有人可以证实这一点吗?

我想知道这个“别的”编码来自哪里,以及如何摆脱它?

编辑:进一步研究:似乎出现0xFF **编码的地方是我做这样的事情:

string str = ...;
wchar_t wch = (wchar_t)str[i];

相同的结果,无论是std :: string还是VCL String。 wchar_t与Unicode不一样吗?

2 个答案:

答案 0 :(得分:4)

我猜测问题是你的编译器char已签名(标准允许它是有符号或无符号的,它是实现定义的/特定的)。因此,无论何时将第7位设置为1(0x80到0xFF)的字符转换为任何较大的整数类型,都将其视为负值,并进行符号扩展以保留负值,或者换句话说,第7位被复制到第8位,第9位,依此类推,进入较大整数类型的所有较高位。因此,0xC7可以变为0xFFC7和0xFFFFFFC7。为防止这种情况发生,请先将chars强制转换为unsigned chars

答案 1 :(得分:1)

宽字符类型w_type是实现定义的,不需要与Unicode字符的概念相对应。查看description of w_type in the Unicode Standard

如果“Ç”更改为0xFFC7,它看起来非常像符号扩展,即字符内部存储为字节0xC7,然后将其作为带符号的8位整数并转换为带符号的16位整数扩展