这是关于Unicode的初学者问题。我正在使用Embarcadero C ++ Builder 2009,他们应该将默认字符串更改为使用Unicode。
似乎解释符号的方式存在冲突。有时我得到一个符号,例如代码0x00C7('Ç'),但有时相同的符号被编码为0xFFC7,例如在源代码编辑器中。据我了解,前者是正确的Unicode,后者是“别的东西”。有人可以证实这一点吗?
我想知道这个“别的”编码来自哪里,以及如何摆脱它?
编辑:进一步研究:似乎出现0xFF **编码的地方是我做这样的事情:
string str = ...;
wchar_t wch = (wchar_t)str[i];
相同的结果,无论是std :: string还是VCL String。 wchar_t
与Unicode不一样吗?
答案 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位整数扩展