16

同一个 Unicode(标准化)表有不同的编码。例如,对于 UTF-8 编码A ,对应 0x0041于 UTF-16 编码,A表示为 0xfeff0041.

从这篇精彩的文章中我了解到,当我使用 C++ 为 Windows 平台编程并处理 Unicode 时,我应该知道它以 2 个字节表示。但它没有说明任何关于编码的内容。(即使它说 x86 CPU 是 little-endian,所以我知道这两个字节是如何存储在内存中的。)但我也应该知道 Unicode 的编码,以便我有关于符号如何存储在内存中的完整信息。C++/Windows 程序员有固定的 Unicode 编码吗?

4

1 回答 1

20

存储在 Windows 内存中的值始终是 UTF-16 little-endian。但这不是您在谈论的内容-您正在查看文件内容。Windows 本身并没有指定文件的编码,而是将其留给各个应用程序。

您在文件开头看到的 0xfe 0xff 是Byte Order Mark 或 BOM。它不仅表明该文件很可能是 Unicode,而且还告诉您 Unicode 编码的变体。

0xfe 0xff      UTF-16 big-endian
0xff 0xfe      UTF-16 little-endian
0xef 0xbb 0xbf UTF-8

除非您知道它是如何编写的,否则应该假定没有 BOM 的文件是 8 位字符。这仍然不能告诉你它是 UTF-8 还是其他 Windows 字符编码,你只需要猜测。

您可以使用记事本作为如何完成此操作的示例。如果文件有 BOM,那么记事本会读取它并适当地处理内容。否则,您必须使用“编码”下拉列表自己指定编码。

编辑:Windows文档对编码没有更具体的原因是Windows是Unicode的早期采用者,当时每个代码点只有一种16位编码。当 65536 个代码点被确定为不足时,发明了代理对作为扩展范围的一种方式,UTF-16 诞生了。微软已经在使用 Unicode 来指代他们的编码并且从未改变过。

于 2012-11-21T18:54:23.550 回答