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

Nar*_*rek 9 c++ windows unicode winapi encoding

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

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

Mar*_*som 15

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

您在文件开头看到的0xfe 0xff是字节顺序标记或BOM.它不仅表明该文件很可能是Unicode,而且它告诉您Unicode编码的哪种变体.

0xfe 0xff      UTF-16 big-endian
0xff 0xfe      UTF-16 little-endian
0xef 0xbb 0xbf UTF-8
Run Code Online (Sandbox Code Playgroud)

除非您知道如何编写,否则应将具有BOM的文件假定为8位字符.这仍然没有告诉你,如果它是UTF-8或其他一些Windows字符编码,你只需要猜测.

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

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

  • **"存储在Windows内存中的值是UTF-16 little-endian,总是."**这就是我需要的!非常感谢!只是我想知道它是否记录在案? (5认同)
  • @Narek,这是一个参考:http://msdn.microsoft.com/en-us/library/windows/desktop/dd374081(v=vs.85).aspx。引用:“通常,Windows 应用程序应在内部使用 UTF-16,仅作为必须使用其他格式的接口上的“薄层”的一部分进行转换。” 事实上,它是小端字节序并不是 Windows 指定的,而是它是小端字节序英特尔处理器这一事实。 (4认同)