为什么 USB 对字符串使用 UTF-16(为什么不使用 UTF-8)

Why does USB use UTF-16 for string (why not UTF-8)

UTF-16 需要 2 个字节,UTF-8 需要 1 个字节。
而USB是面向8bit的,UTF-8更自然

UTF-8 向后兼容 ASCII,UTF-16 则不然。

UTF-16 需要 2 个字节,因此,它可能存在字节顺序问题。
(出现字节序问题,后来被USB-IF清除为little endian。)

UTF-16 和 UTF-8 在功能上是

但为什么是 UTF-16?为什么不是 UTF-8?


UTF-16和UTF-8的比较: https://en.wikipedia.org/wiki/UTF-8#Compared_to_UTF-16

UTF-16 require 2 byte and UTF-8 require 1 byte.

这两个方面都是错误的。 UTF-8 和 UTF-16 都是变长编码。您可能正在考虑 UCS-2(UTF-16 的前身),它确实只使用 2 个字节(因此仅限于 U+FFFF 的代码点)。

UTF-8 使用 1 个字节用于代码点 U+0000 - U+007F,2 个字节用于代码点 U+0080 - U+07FF,3 个字节用于 U+0800 - U+FFFF,4 个字节用于代码点 U +10000 - U+10FFFF.

UTF-16 代码点 U+0000 - U+FFFF 使用 2 个字节,代码点 U+10000 - U+10FFFF 使用 4 个字节。

and USB is 8bit oriented, UTF-8 is more natural.

不是真的。如果考虑到上面提到的字节大小,UTF-16 实际上比 UTF-8 可以用更少的代码单元处理更多的代码点。但无论如何,USB 更关心二进制数据而不是人类可读的文本数据。即使是 Unicode 字符串也以字节数为前缀,而不是字符数。因此 USB 的设计者可以使用他们想要的任何编码,只要他们将其标准化即可。他们选择了UTF-16LE。

为什么?问设计师。我的猜测(这只是一个猜测)是因为微软与人合着了USB 1.0规范,而UCS-2(现在是UTF-16LE)是微软为[=32选择的编码=],因此他们可能希望在不涉及大量运行时转换的情况下保持兼容性。当时,Windows 几乎占据了 PC 市场的 90%,而其他 OSes,尤其是 *Nix,只有 5%。 Windows 98 是第一个在 OS 中直接内置 USB 的 Windows 版本(USB 在 Windows 95 中是一个可选的附加组件),但即便如此,USB在 Apple 几年后最终为 iMac 添加 USB 支持之前,PC 已经开始流行。

此外,可能更重要的是,当时 UTF-8 还相对较新(编写 USB 1.0 时才几年),UCS-2 已经存在了一段时间并且是当时的主要 Unicode 编码时间(Unicode 在几年内不会超过 65536 个代码点)。因此,通过使用 UCS-2(后来的 UTF-16LE)而不是 UTF-8 让 USB 支持国际文本在当时可能是有意义的。如果他们决定改用 8 位编码,ISO-8859-1 可能比 UTF-8 更有意义(但按照今天的标准,ISO-8859-1 不再适用)。当 Unicode 最终打破 UCS-2 的 65536 代码点限制时,在不破坏向后兼容性的情况下将编码更改为其他内容为时已晚。至少 UTF-16 向后兼容 UCS-2(这与 Windows 仍在使用 UTF-16 而不是像其他 OSes 那样切换到 UTF-8 的原因相同)。

UTF-8 is backward compatible with ASCII, UTF-16 isn't.

正确。

UTF-16 require 2 byte, so, it could have endianness problem.

没错。就此而言,与 UTF-32 相同。