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

为什么USB使用UTF-16作为字符串(为什么不是UTF-8),utf-8,character-encoding,usb,ascii,utf-16,Utf 8,Character Encoding,Usb,Ascii,Utf 16,UTF-16需要2字节,UTF-8需要1字节。 USB是面向8位的,UTF-8更自然 UTF-8向后兼容ASCII,UTF-16则不兼容 UTF-16需要2个字节,因此,它可能有端性问题。 (endian出现问题,后来USB-IF将其清除为little endian。) UTF-16和UTF-8在功能上 但是为什么是UTF-16呢?为什么不是UTF-8 UTF-16和UTF-8的比较: UTF-16需要2个字节,UTF-8需要1个字节 这两方面都是错误的。UTF-8和UTF-16都是可变长度

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

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

UTF-16需要2个字节,因此,它可能有端性问题。
(endian出现问题,后来USB-IF将其清除为little endian。)

UTF-16和UTF-8在功能上

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


UTF-16和UTF-8的比较:

UTF-16需要2个字节,UTF-8需要1个字节

这两方面都是错误的。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个字节

USB是面向8位的,UTF-8更自然

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

为什么??问问设计师。我的猜测(这只是猜测)是因为微软共同编写了USB 1.0规范,而UCS-2(现在的UTF-16LE)是微软为Windows选择的编码,所以他们可能希望在不涉及大量运行时转换的情况下保持兼容性。当时,Windows几乎占据了PC市场90%的份额,而其他操作系统,尤其是*Nix,仅占5%左右。Windows 98是第一个直接在操作系统中安装USB的Windows版本(USB是Windows 95中的可选附加组件),但即便如此,在几年后苹果最终将USB支持添加到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,而不像其他操作系统那样切换到UTF-8的原因)

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

UTF-16需要2个字节,因此,它可能有端点问题

对。就这点而言,UTF-32也是如此