如何从实验的角度来(查Unicode码表)验证:几乎所有的汉字,都要占用3个字节?


以下引用自 《松本行弘的程序世界》 第七章:文字编码 P184

UTF8的缺点:
1.消费过多的内存。如果仅限于ASCII空间,则与ASCII相同。 但几乎所有的汉字,都要占用3个字节
2. 构成文字的字节数是可变的,因而在随机访问字符串中的任意文字时,代价与字符串的长度成比例

第一个问题:在我的印象当中,每个汉字占用2个字节,为什么这边说 几乎所有的汉字,都要占用3个字节 ,这句话该怎么理解,最好能举例说明下,自己对文字编码的确实没啥基础

第二个问题:构成文字的字节数是可变的,比如这样一段话: Unicode字符集 ,每个英文字母占用一个字节,每个汉字占用2个字节(没错吧),但根据第一个问题,基本所有的汉字都占用3个字节,那么计算机在处理一段既包含2个字节又包含有3个字节的句子时,会怎样处理?
会为了提高处理效率而将2个字节的汉字当做2个字节来处理吗?

注:以上问题,希望大家在帮忙解答的时候,如果有用到比较好的字符编码工具,也麻烦大家顺带说下,比如:查看Unicode码表

utf-8 编码 unicode 字符编码

MoRod 10 years, 1 month ago

字符的编码不同,看下面这段复制来的。

通常我们所说是2字节(GB-2312)。
具体依据汉字编码形式有所不同:
GB-231280 编码为 2个字节(Byte) 包含了 20902 个汉字,其编码范围是 0x8140-0xfefe。
GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。编码是变长的,其二字节部分与 GBK 兼容;四字节部分是扩充的字形、字位,其编码范围是首字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39
Unicode 范围一般所用为\U0000-\UFFFF,对于CJK EXT B区汉字,范围大于\U20000
UTF, 按其基本长度所用位数分为UTF-8/16/32。其中:UTF-8是变长编码,每个Unicode代码点按照不同范围,可以有1-3字节的不同长度。

UTF-16长度相对固定,只要不处理大于\U200000范围的字符,每个Unicode代码点使用16位即2字节表示,超出部分使用两个UTF-16即4字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE。

UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。按照高低位字节顺序,又分为UTF-32BE/UTF-32LE。

大概是帽子 answered 10 years, 1 month ago

Your Answer