Utf 8 什么是多字节字符集?

Utf 8 什么是多字节字符集?,utf-8,terminology,multibyte,Utf 8,Terminology,Multibyte,术语“多字节”是指字符可以(但不一定)大于1字节的字符集(例如UTF-8),还是指在任何情况下都大于1字节的字符集(例如UTF-16)?换句话说:如果有人谈论多字节字符集,这意味着什么?通常是前者,即类似UTF-8的字符集。有关更多信息,请参见。前者-尽管术语“可变长度编码”更合适。我通常使用它来指代每个字符的字节数超过一个的任何字符。没有1字节=1个字符映射的所有字符集。所有Unicode变体以及亚洲字符集都是多字节的 有关更多信息,我建议阅读。多字节字符意味着编码需要超过1字节的字符。但是,

术语“多字节”是指字符可以(但不一定)大于1字节的字符集(例如UTF-8),还是指在任何情况下都大于1字节的字符集(例如UTF-16)?换句话说:如果有人谈论多字节字符集,这意味着什么?

通常是前者,即类似UTF-8的字符集。有关更多信息,请参见。

前者-尽管术语“可变长度编码”更合适。

我通常使用它来指代每个字符的字节数超过一个的任何字符。

没有1字节=1个字符映射的所有字符集。所有Unicode变体以及亚洲字符集都是多字节的


有关更多信息,我建议阅读。

多字节字符意味着编码需要超过1字节的字符。但是,这并不意味着使用该特定编码的所有字符将具有相同的宽度(以字节为单位)。例如:UTF-8和UTF-16编码字符有时可能使用多个字节,而所有UTF-32编码字符始终使用32位

参考资料:


这个术语模棱两可,但在我的国际化工作中,我们通常避免使用“多字节字符集”来指代基于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

多字节字符集可以由一个字节和两个字节组成 人物。因此,多字节字符串可能包含以下内容的混合 单字节和双字节字符


参考:

UTF-8是多字节的,这意味着每个英文字符(ASCII)存储在1字节中,而非英文字符(如汉语、泰国语)存储在3字节中。当你把汉语/泰语和英语混在一起时,比如“ท“t”,第一个泰国字“ท" 使用3个字节,而第二个英文字符“t”只使用1个字节。设计多字节编码的人意识到,英文字符不应该存储在3个字节中,而可以存储在1个字节中,因为这样会浪费存储空间

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

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