什么是多字节字符集?

48

“multibyte”一词是指字符集中的字符可以-但不一定-比1个字节更宽(例如UTF-8),还是指字符集中的字符在任何情况下都比1个字节更宽(例如UTF-16)?换句话说,如果有人谈论多字节字符集,这是什么意思?

9个回答

39

这个术语含义不太清晰,但在我的国际化工作中,我们通常避免使用"多字节字符集"来指代基于Unicode的编码。通常,我们只使用该术语来表示那些每个字符需要一个或多个字节来定义的旧编码方案(不包括每个字符仅需要一个字节的编码)。

Shift-jis、jis、euc-jp、euc-kr以及汉字编码通常被包括在内。

大多数旧编码方案有一定的状态机模型(或更简单的页面交换模型)来处理,而在文本流中向后移动比较容易,但向前移动则困难且容易出错。UTF-8和UTF-16则没有这个问题,因为UTF-8可以通过位掩码测试,而UTF-16可以与一系列代理对进行测试,因此在非异常情况下的文档中进行向前和向后的移动可以安全地完成,而不需要太复杂的操作。

少数几种用于泰语和越南语等语言的旧编码方案,具有一些多字节字符集的复杂性,但实际上只是基于组合字符构建,并不通常归入广义的"多字节"术语中。


18
如果有人谈论多字节字符集,究竟意味着什么,通常取决于说话者的背景!从逻辑上讲,它应该包括 UTF-8、Shift-JIS、GB 等:可变长度编码。UTF-16 通常不会被认为是这一组(尽管它在替代方案中也是如此,当使用 UTF-16LE/UTF-16BE 将其编码为字节时它肯定是多字节的)。但在 Microsoft 的领域中,这个术语更多的含义是指一个可变长度的默认系统代码页(用于遗留非 Unicode 应用程序,可惜这样的应用程序还有很多)。在这种情况下,UTF-8 和 UTF-16LE/UTF-16BE 不能被包括在内,因为 Windows 上的系统代码页无法设置为这些编码。实际上,在某些情况下,“mbcs” 只不过是系统代码页的同义词,而系统代码页更具迷惑性,又称“ANSI”。在这种情况下,“多字节”字符集实际上可能只是像 cp1252 西欧这样的微不足道的东西,每个字符只使用一个字节!我的建议是:当你需要指的是可变长度字符集时,使用“variable-length”,避免模棱两可的术语“multibyte”;当别人使用它时,你需要请求澄清,但通常一个有 Windows 背景的人会谈论如 cp932(Shift-JIS)之类的遗留东亚代码页,而不是 UTF。

8

所有字符集都不具备1字节=1字符映射的特性。包括Unicode变体和亚洲字符集都是多字节的。

如需了解更多信息,请阅读此维基百科文章


7

1
@DanielW。Microsoft的链接已经更新。 - li ki

3

UTF-8是一种多字节编码方式,这意味着每个英文字母(ASCII)存储在1个字节中,而像中文、泰语等非英语字符则存储在3个字节中。当你将中文/泰语与英语混合使用时,比如“ทt”,第一个泰语字符“ท”使用了3个字节,而第二个英语字符“t”只使用了1个字节。设计多字节编码的人员认为,由于浪费存储空间,英语字符不应该存储在3个字节中。

UTF-16将每个字符(英语或非英语)固定存储在2个字节长度中,因此它不是多字节编码,而被称为宽字符。它非常适合中文/泰语等语言,其中每个字符完全适合2个字节,但是将其打印到utf-8控制台输出需要使用函数wcstombs()进行从宽字符到多字节格式的转换。

UTF-32将每个字符都固定存储在4个字节长度中,但由于存储空间的浪费,没有人使用它来存储字符。


3
一个多字节字符集可以由一字节和两字节字符组成。因此,一个多字节字符串可能包含混合的单字节和双字节字符。
参考文献:单字节和多字节字符集

2
通常采用前者,即类似UTF-8的变宽编码方式。更多信息请参见变宽编码

2
前者,尽管术语“可变长度编码”更为恰当。

2

通常我用这个术语来指代任何一个字符,可能每个字符都有多个字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接