术语多字节是指一个字符集,其字符可以 - 但不一定是 - 宽于1个字节(例如UTF-8),或者它指的是在任何情况下宽于1个字节的字符集(例如UTF-16)?换句话说:如果有人谈论多字节字符集是什么意思?
答案 0 :(得分:30)
该术语含糊不清,但在我的国际化工作中,我们通常避免使用术语“多字节字符集”来引用基于Unicode的编码。通常,我们仅将该术语用于具有一个或多个字节的传统编码方案,以定义每个字符(不包括每个字符只需要一个字节的编码)。
通常包括Shift-jis,jis,euc-jp,euc-kr以及中文编码。除了一些例外情况,大多数遗留编码都需要一种状态机模型(或更简单地说,一种页面交换模型)来处理,而在文本流中向后移动则很复杂且容易出错。 UTF-8和UTF-16不会遇到这个问题,因为可以使用位掩码测试UTF-8,并且可以针对一系列代理对测试UTF-16,因此在非病理文档中前后移动可以在没有重大复杂性的情况下安全地完成。
对于像泰语和越南语这样的语言,一些遗留编码具有多字节字符集的一些复杂性,但实际上只是基于组合字符,并且通常不会与广义术语“多字节”混为一谈。
答案 1 :(得分: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。
答案 2 :(得分:6)
您没有1字节= 1字符映射的所有字符集。所有Unicode变体,以及亚洲字符集都是多字节的。
有关详细信息,建议您阅读this Wikipedia article。
答案 3 :(得分:4)
多字节字符表示编码需要1个字节以上的字符。然而,这并不意味着使用该特定编码的所有字符将具有相同的宽度(以字节计)。例如:UTF-8和UTF-16编码字符有时可能使用多个字节,而所有 UTF-32编码字符总是使用32位。
参考文献:
答案 4 :(得分:2)
通常是前者,即类似UTF-8。有关详细信息,请参阅Variable-width encoding。
答案 5 :(得分:2)
前者 - 虽然术语“可变长度编码”更合适。
答案 6 :(得分:2)
我通常用它来指代可以每个字符有多个字节的任何字符。
答案 7 :(得分:1)
多字节字符集可以包含单字节和双字节 字符。因此,多字节字符串可以包含混合 单字节和双字节字符。
答案 8 :(得分:1)
UTF-8是多字节的,这意味着每个英文字符(ASCII)都存储在1个字节中,而非英语字符(如中文,泰语)则存储在3个字节中。当您将中文/泰语与英语(例如“ทt”)混合使用时,第一个泰文字符“ท”使用3个字节,而第二个英文字符“ t”仅使用1个字节。设计多字节编码的人意识到,由于浪费存储空间,英文字符不应以3个字节存储,而可以容纳1个字节。
UTF-16将每个字符以固定的2字节长度存储英语或非英语字符,因此它不是多字节,而是称为宽字符。它非常适用于每个字符都完全适合2个字节的中文/泰语,但是要打印到utf-8控制台输出,需要使用wcstombs()函数将宽字符转换为多字节格式。
UTF-32以固定的4字节长度存储每个字符,但是由于浪费存储空间,没有人使用它来存储字符。