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

Kul*_*aka 2 usb ascii utf-8 utf-16 character-encoding

UTF-16需要2个字节,UTF-8需要1个字节.
USB是8bit导向,UTF-8更自然.

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

UTF-16需要2个字节,因此,它可能有字节序问题.
(发生了字节序问题,后来它被USB-IF清除为小端.)

UTF-16和UTF-8在功能上

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


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

Rem*_*eau 7

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是8bit导向,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中的一个可选插件),但即便如此,在苹果最终在iMacs上添加USB支持几年之前,USB已经在PC中流行起来后来.

此外,可能更重要的是,当时UTF-8还是相对较新的(创建USB 1.0时只有几年的历史),UCS-2已经存在了一段时间,并且当时是主要的Unicode编码(Unicode会多年不超过65536个代码点).因此,当时使用UCS-2(后来的UTF-16LE)而不是UTF-8来支持国际文本可能是有意义的.如果他们决定使用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相同.