术语多字节是指一个字符集,其字符可以(但不必)宽于 1 个字节(例如 UTF-8)还是指在任何情况下都大于 1 个字节的字符集(例如 UTF -16) ? 换句话说:如果有人谈论多字节字符集,这意味着什么?
9 回答
该术语含糊不清,但在我的国际化工作中,我们通常避免使用术语“多字节字符集”来指代基于 Unicode 的编码。通常,我们仅将这个术语用于具有一个或多个字节来定义每个字符的传统编码方案(不包括每个字符只需要一个字节的编码)。
通常包括 Shift-jis、jis、euc-jp、euc-kr 以及中文编码。
大多数遗留编码,除了一些例外,需要一种状态机模型(或更简单地说,页面交换模型)来处理,并且在文本流中向后移动是复杂且容易出错的。UTF-8 和 UTF-16 不会遇到这个问题,因为 UTF-8 可以使用位掩码进行测试,而 UTF-16 可以针对一系列代理对进行测试,因此在非病态文档中前后移动可以安全地完成,没有很大的复杂性。
对于泰语和越南语等语言,一些遗留编码具有多字节字符集的一些复杂性,但实际上只是建立在组合字符之上,并且通常不与广义术语“多字节”混为一谈。
如果有人谈论多字节字符集是什么意思?
像往常一样,这取决于谁在说话!
从逻辑上讲,它应该包括 UTF-8、Shift-JIS、GB 等:可变长度编码。在这个组中通常不会考虑 UTF-16(即使它有点像,代理项是什么;当然,当通过 UTF-16LE/UTF-16BE 编码为字节时它是多个字节)。
但在 Microsoftland 中,该术语更典型地用于表示可变长度的默认系统代码页(对于遗留的非 Unicode 应用程序,遗憾的是仍然有很多)。在这种用法中,不能包含 UTF-8 和 UTF-16LE/UTF-16BE,因为 Windows 上的系统代码页不能设置为这两种编码中的任何一种。
事实上,在某些情况下,“mbcs”只不过是系统代码页的同义词,也称为“ANSI”(甚至更容易引起误解)。在这种情况下,“多字节”字符集实际上可能像 cp1252 西欧那样微不足道,每个字符只使用一个字节!
我的建议:当你有这个意思时使用“可变长度”,并避免使用模棱两可的术语“多字节”;当其他人使用它时,您需要要求澄清,但通常具有 Windows 背景的人会谈论传统的东亚代码页,如 cp932 (Shift-JIS) 而不是 UTF。
您没有 1 字节 = 1 字符映射的所有字符集。所有 Unicode 变体,以及亚洲字符集都是多字节的。
有关更多信息,我建议阅读此 Wikipedia 文章。
多字节字符表示其编码需要超过 1 个字节的字符。然而,这并不意味着使用该特定编码的所有字符都将具有相同的宽度(以字节计)。例如:UTF-8 和 UTF-16 编码的字符有时可能使用多个字节,而所有UTF-32 编码的字符总是使用 32 位。
参考:
通常是前者,即类 UTF-8。有关详细信息,请参阅可变宽度编码。
前者——尽管术语“可变长度编码”更合适。
我通常用它来指代每个字符可以有多个字节的任何字符。
多字节字符集可以由一字节和两字节字符组成。因此,多字节字符串可能包含单字节和双字节字符的混合。
参考:单字节和多字节字符集
UTF-8 是多字节的,这意味着每个英文字符(ASCII)存储在 1 个字节中,而非英文字符(如中文、泰文)存储在 3 个字节中。当您将中文/泰文与英文混合时,例如“ทt”,第一个泰文字符“ท”使用 3 个字节,而第二个英文字符“t”仅使用 1 个字节。设计多字节编码的人意识到,英文字符不应该存储在 3 个字节中,而可以放在 1 个字节中,因为这样会浪费存储空间。
UTF-16 以固定的 2 字节长度存储每个英文或非英文字符,因此它不是多字节而是称为宽字符。它非常适合每个字符完全适合 2 个字节的中文/泰语语言,但打印到 utf-8 控制台输出需要使用函数 wcstombs() 从宽字符转换为多字节格式。
UTF-32 以固定的 4 字节长度存储每个字符,但由于浪费存储空间,没有人使用它来存储字符。