Unicode转换问题

Unicode conversion issues

本文关键字:问题 转换 Unicode      更新时间:2023-10-16

这是一个关于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不一样吗?

我猜问题是在编译器中char是有符号的(标准允许它有符号或无符号,它是实现定义的/特定的)。因此,每当您将第7位设置为1 (0x80到0xFF)的字符转换为任何更大的整数类型时,它都会被视为负值并进行符号扩展以保留负值,或者换句话说,这个第7位被复制到第8位,第9位等等,到更大整数类型的所有更高位。所以,0xC7可以变成0xFFC7和0xFFFFFFC7。为了防止这种情况的发生,先将chars转换为unsigned chars

宽字符类型w_type是实现定义的,不需要对应于Unicode字符的概念。查看Unicode标准中w_type的描述。

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