Windows使用什么Unicode编码(UTF-8、UTF-16或其他)来表示其Unicode数据类型?

20

同一个Unicode(标准化)table有不同的编码方式。例如,对于UTF-8编码,Acorresponds to0x0041,但是对于UTF-16编码,相同的Arepresented as0xfeff0041

从这篇brilliant article中,我了解到在Windows平台上使用C++进行Unicode编程时,需要知道Unicode由2个字节表示。但它并未说明编码方式。(它甚至说x86 CPU是小端序,所以我知道这两个字节如何存储在内存中。)但我还应该了解Unicode的编码方式,以便完全了解符号在内存中的存储方式。是否有适用于C++ / Windows程序员的固定Unicode编码?


12
在UTF-16中,A不是以0xfeff0041表示的。它在UTF-8中是0x41,在UTF-16中是0x0041 - Remy Lebeau
这是我之前提到的信息来源:http://www.fileformat.info/info/charset/UTF-16/list.htm。那么它是如何存储的呢? - Narek
5
您的信息来源有误,所有这些数值前都不应该带有“FEFF”。0xFEFF 是用作UTF-16 BOM。 - Remy Lebeau
4
@Narek 0xfeff是字节顺序标记 ,那个表格只是告诉你接下来的两个字节的顺序。如果你前往A页面,你会看到UTF-8编码是0x41,UTF-16编码是0x0041。 - Joseph Mansfield
3
UTF-8将Unicode代码点编码为1、2、3或4个字节,取决于其值大小;UTF-16将Unicode代码点编码为2或4个字节,取决于其值大小。只有ASCII字符(0x00-0x7F)在UTF-8和UTF-16编码中具有相同的值。否则,代码点0x80及以上的字符在两种编码方式中被不同地编码。 - Remy Lebeau
显示剩余5条评论
1个回答

27
Windows存储在内存中的值始终为UTF-16小端格式。但这并不是你所讨论的内容——你正在查看文件内容。Windows本身并未指定文件的编码方式,而是将其留给各个应用程序自行决定。
文件开头看到的0xfe 0xff是一个字节顺序标记或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。Microsoft已经在使用Unicode来引用他们的编码,并且从未更改。

12
Windows存储在内存中的值始终为UTF-16小端格式。这是您需要的内容!非常感谢!我只想知道这是否有记录文档? - Narek
4
@Narek,这是一个参考链接:http://msdn.microsoft.com/en-us/library/windows/desktop/dd374081(v=vs.85).aspx。引用内容:“一般来说,Windows 应用程序应在内部使用 UTF-16,只有在必须使用其他格式的接口上方才进行转换。”它是小端序并不是由 Windows 指定的,而是因为它是一个小端序的英特尔处理器。 - Mark Ransom
@RemyLebeau,这篇文章认为当Notepad在没有找到BOM时,它的猜测能力已经达到了预期的水平。我的建议是不要猜测,而是让用户自己决定,而Notepad(至少在Win7中)也提供了这个选项。 - Mark Ransom
1
再次强调,Windows 中存储在内存中的值并不总是 UTF-16 小端。您可以在 Windows 应用程序中以任何编码方式存储任何值。每个访问该内存的程序都可以自行决定如何处理它。许多 Windows API 函数使用 UTF-16,但这只是其中一个 API。 - Dan Korn
@DanKorn 当我说“为 Windows”时,我的意思是用于 Windows API,实际上也适用于大多数其他 Microsoft APIs。 - Mark Ransom
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接