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

时间:2016-07-12 07:50:28

标签: utf-8 character-encoding usb ascii utf-16

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

1 个答案:

答案 0 :(得分: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使用2个字节 - U + 10FFFF。

  

和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中的一个可选插件),但即便如此,在苹果最终在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相同,就此而言。