为什么 Windows 使用 UTF-16LE?

Why does Windows use UTF-16LE?

虽然大多数 Unix/POSIX/etc 世界使用 UTF-8 进行文本表示,但 Windows 使用 UTF-16LE。

这是为什么?有很多人说 Windows API 是在 UTF-8(甚至我们所知的 Unicode)存在之前编写的 (1, 2, 3),所以 UTF-16(甚至更早的 UCS-2)是他们拥有的最好的,将现有的 API 转换为 UTF-8 将是一项荒谬的工作量。

但这两种说法是否有任何官方来源? The official MSDN page for Unicode 使 UTF-16 看起来更受欢迎(尽管我自己并不同意):

These functions use UTF-16 (wide character) encoding, which is the most common encoding of Unicode and the one used for native Unicode encoding on Windows operating systems.

是否有任何官方说明(或从事该项目的工程师)解释 选择 UTF-16 的原因和 为什么 Windows would/would 不切换到 UTF-8?

“世界”很可能是指一切:操作系统(内部使用的编码),可执行文件(支持的编码),文件格式(支持的编码),文件系统(内部使用的编码)等等。

Windows 不会轻易切换,因为 PE (used in EXE, DLL and whatnot) have resource strings 等基本文件格式只能处理 WORD 中的代码点.该格式已经是补丁上的补丁上的补丁,并且向其添加另一个扩展可能比仅使用二进制资源块并将它们转换为 UTF-8.

自从在 Windows 中引入了 Unicode 之后,它的 API 被布置成 WORD每个字符;每个函数的大多数 ANSI 版本只是调用该函数的 WIDE 版本的存根。对于 UTF-8,它不能被强制执行,并且会破坏所有遗留代码——需要一个全新的 API(或每个函数的第三个版本)。只有少数函数是“未来就绪”的,因为您可以告诉它们文本的编码方式(很明显,例如 MultiByteToWideChar())。

NTFS stores every character in WORDs,也是(因此间接支持 UTF-16),我看不出它的新版本会有什么变化 - 我而是打赌一个全新的文件系统将被引入,它至少具有将所有文件名存储在 UTF-8.

Windows 是最早采用 Unicode 的操作系统之一。那时,确实还没有 UTF-8,UCS-2 是 Unicode 最常用的编码。所以 Windows' 最初的 Unicode 支持是基于 UCS-2。

当 Unicode 超过 UCS-2,UTF-8 和 UTF-16 变得更流行时,Windows 在不破坏大量现有代码的情况下切换到 UTF-8 为时已晚 1,但是 UTF-16 向后兼容 UCS-2,因此 Microsoft 能够以最小的努力切换到 UTF-16,并且对现有用户代码几乎没有更改。

1:20 多年后的现在,在 Windows10 年,Microsoft 才刚刚开始真正开始在 Win32 上支持 UTF-8 API 层 ,但该功能仍处于实验阶段,必须由用户手动启用或通过应用程序清单在每个应用程序的基础上启用,并且通常需要更改用户代码才能利用 UTF8 -enabled APIs 而不是基于 UTF16 的 APIs.

Raymond Chen 实际上有一个“官方”答案——或者至少是来自 Microsoft 来源的答案(强调已添加):

Windows adopted Unicode before most other operating systems.[citation needed] As a result, Windows’s solutions to many problems differ from solutions adopted by those who waited for the dust to settle.¹ The most notable example of this is that Windows used UCS-2 as the Unicode encoding. This was the encoding recommended by the Unicode Consortium because Unicode 1.0 supported only 65536 characters.² The Unicode Consortium changed their minds five years later, but by then it was far too late for Windows, which had already shipped Win32s, Windows NT 3.1, Windows NT 3.5, Windows NT 3.51, and Windows 95, all of which used UCS-2

The sad history of Unicode printf-style format specifiers in Visual C++

换句话说,Remy Lebeau 和 AmigoJack 都是对的——Windows 在 UTF-8 被推荐之前采用了 Unicode(甚至存在?);当时,UCS-2 是标准,所以 Windows 选择了它。

当我们意识到整个人类语言(以及现在的表情符号)需要超过 65,536 个字符时,Windows 已经发布了几个版本,它将是改变.

非常不切实际(如果不是不可能的话) 感谢所有为这个问题提供答案的人!由于我正在寻找官方来源,因此我将其标记为答案(尽管我将其标记为社区维基,因为它是一个合并)。