“multibyte”一词是指字符集中的字符可以-但不一定-比1个字节更宽(例如UTF-8),还是指字符集中的字符在任何情况下都比1个字节更宽(例如UTF-16)?换句话说,如果有人谈论多字节字符集,这是什么意思?
“multibyte”一词是指字符集中的字符可以-但不一定-比1个字节更宽(例如UTF-8),还是指字符集中的字符在任何情况下都比1个字节更宽(例如UTF-16)?换句话说,如果有人谈论多字节字符集,这是什么意思?
这个术语含义不太清晰,但在我的国际化工作中,我们通常避免使用"多字节字符集"来指代基于Unicode的编码。通常,我们只使用该术语来表示那些每个字符需要一个或多个字节来定义的旧编码方案(不包括每个字符仅需要一个字节的编码)。
Shift-jis、jis、euc-jp、euc-kr以及汉字编码通常被包括在内。
大多数旧编码方案有一定的状态机模型(或更简单的页面交换模型)来处理,而在文本流中向后移动比较容易,但向前移动则困难且容易出错。UTF-8和UTF-16则没有这个问题,因为UTF-8可以通过位掩码测试,而UTF-16可以与一系列代理对进行测试,因此在非异常情况下的文档中进行向前和向后的移动可以安全地完成,而不需要太复杂的操作。
少数几种用于泰语和越南语等语言的旧编码方案,具有一些多字节字符集的复杂性,但实际上只是基于组合字符构建,并不通常归入广义的"多字节"术语中。
UTF-8是一种多字节编码方式,这意味着每个英文字母(ASCII)存储在1个字节中,而像中文、泰语等非英语字符则存储在3个字节中。当你将中文/泰语与英语混合使用时,比如“ทt”,第一个泰语字符“ท”使用了3个字节,而第二个英语字符“t”只使用了1个字节。设计多字节编码的人员认为,由于浪费存储空间,英语字符不应该存储在3个字节中。
UTF-16将每个字符(英语或非英语)固定存储在2个字节长度中,因此它不是多字节编码,而被称为宽字符。它非常适合中文/泰语等语言,其中每个字符完全适合2个字节,但是将其打印到utf-8控制台输出需要使用函数wcstombs()进行从宽字符到多字节格式的转换。
UTF-32将每个字符都固定存储在4个字节长度中,但由于存储空间的浪费,没有人使用它来存储字符。
通常我用这个术语来指代任何一个字符,可能每个字符都有多个字节。