Windows使用什么unicode编码(UTF-8,UTF-16,其他)作为其Unicode数据类型?

时间:2012-11-21 18:40:10

标签: c++ windows winapi unicode encoding

相同的Unicode(标准化)table有不同的编码。例如,对于UTF-8编码A corresponds to 0x0041,但对于UTF-16编码,相同的Arepresented as 0xfeff0041

从这个brilliant article我已经了解到,当我使用C ++ for Windows平台编程并处理Unicode时,我应该知道它以2个字节表示。但它没有说明编码。 (即使它说x86 CPU是little-endian所以我知道这两个字节是如何存储在内存中的。)但是我也应该知道Unicode的编码,这样我就可以获得有关符号如何存储在内存中的完整信息。 C ++ / Windows程序员有没有固定的Unicode编码?

1 个答案:

答案 0 :(得分:14)

Windows内存中存储的值始终为UTF-16 little-endian。但那不是你所说的 - 你在看文件内容。 Windows本身不指定文件的编码,而是将其留给单个应用程序。

您在文件开头看到的0xfe 0xff为Byte Order Mark or 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的早期采用者,当时有only one encoding of 16 bits per code point。当确定65536个代码点不合适时,代理对被发明为扩展范围的方式,并且UTF-16诞生了。微软已经使用Unicode来引用他们的编码而且从未改变过。