【发布时间】:2010-05-28 11:12:41
【问题描述】:
据我所知,Linux 选择了向后兼容 UTF-8,而 Windows 为 UTF-16 添加了全新的 API 函数(以“W”结尾)。这些决定会有所不同吗?哪一个被证明更好?
【问题讨论】:
据我所知,Linux 选择了向后兼容 UTF-8,而 Windows 为 UTF-16 添加了全新的 API 函数(以“W”结尾)。这些决定会有所不同吗?哪一个被证明更好?
【问题讨论】:
UTF-16 几乎是一种损失,两全其美。它既不紧凑(对于 ASCII 字符的典型情况),也不将每个代码单元映射到一个字符。这并没有对任何人造成太大影响,因为基本多语言位面之外的字符仍然很少使用,但它确实很丑。
POSIX(Linux 等)也有一些 w API,基于 wchar_t 类型。在 Windows 以外的平台上,这通常对应于 UTF-32 而不是 UTF-16。这很适合简单的字符串操作,但非常臃肿。
但内存中的 API 并不是那么重要。造成更大困难的是文件存储和在线协议,其中数据在具有不同字符集传统的应用程序之间交换。
在这里,紧凑性胜过易于索引;到目前为止,UTF-8 显然被证明是最好的格式,而 Windows 对 UTF-8 的糟糕支持造成了真正的困难。 Windows 是最后一个仍然具有特定于语言环境的默认编码的现代操作系统;默认情况下,其他所有人都已迁移到 UTF-8。
虽然我非常希望 Microsoft 会在未来的版本中重新考虑这一点,因为即使在仅 Windows 的世界中它也会导致巨大且不必要的问题,但它是如何发生的是可以理解的。
在过去设计 WinNT 时的想法是,UCS-2 是 it 用于 Unicode。不会有任何超出 16 位字符范围的内容。每个人都会在内存中使用 UCS-2,自然最容易直接从内存中保存这些内容。这就是为什么 Windows 将这种格式称为“Unicode”,并且直到今天仍然在 UI 中将 UTF-16LE 称为“Unicode”,就像保存框一样,尽管它完全具有误导性。
UTF-8 甚至在 Unicode 2.0 之前都没有标准化(连同扩展的字符范围和使 UTF-16 成为今天这样的代理)。那时微软已经开始使用 WinNT4,此时改变策略为时已晚。简而言之,在 Unicode 处于起步阶段的时候,微软从头开始设计一个新的操作系统是很不幸的。
【讨论】:
早在 90 年代初(Windows NT 3.1 于 1993 年问世),在 Linux 还没有支持 Unicode 的概念之前,Windows 就选择使用 UTF-16 来支持 Unicode,并且随之而来的 Ascii/Unicode 功能以 WAAAAAAY 的方式 WAAAAAAY。
Linux 已经能够从在 Windows 和其他支持 Unicode 的平台上构建的最佳实践中学习。
今天很多人都会同意,由于大小原因,UTF-8 是更好的编码,除非您知道您绝对要处理大量双字节字符 - 完全是 - 其中 UTF-16 更节省空间。
【讨论】: