UTF8编码问题

在网上看到这么一段话:“UTF-8编码是变长编码,通常汉字占三个字节,扩展B区以后的汉字占四个字节。”
请问里面的扩展B区是什么意思呢


回答:

unicode 里汉字(CJK Unified Ideographs)分了很多个区,现在里面有 CJK Unifed Ideograph, CJK Extension A, ..., CJK Extension G 一共八个区,分别占了编码的不同区段。扩展 B 区就是 CJK Extension B 。

这些不同区的汉字是在 unicode 发展过程中逐渐增补进去的。


biang biang 面的 biang 就是最近才收进去的,在 Extension G 里,U+30EDD 跟 U+30EDE (一简一繁)。就是现在还没啥字体能显示。输入法也不知道几时才能支持。

在上面 code charts 里 extension G 的 pdf 里是可以看到的。


回答:

UTF-8 一个字符可以是 1~4 个字节,我们按长度分的话就有:

  • UTF8-1
  • UTF8-2
  • UTF8-3
  • UTF8-4

这四个大的范围。每个范围里可表示的字符不同。比如 UTF8-1 其实就是 ASCII,范围 0x00~0x7F;UTF8-2 其实就是带高低位的 ISO-Latin-1,范围 0xC2~0xDF + 0x80~0xBF;等等等等。

为什么要这么设计?因为历史包袱问题,Unicode 有一个设计目标就是要兼容早期的国际上已经成为事实标准的那部分编码。(ASCII 是美标,ISO-Latin-1 是欧标,这没办法,计算机这方面欧美作为先行者肯定话语权更大)

但是世界上的语言和符号茫茫多,甚至很多符号仅在历史中存在、其发明者的文明都已经消亡了的,不可能一步到位全都提前编码好,后面肯定会慢慢补充新的字符进去的。为了管理起来方便、也为了方便在程序里判断字符所在的范围方便,最好是同一门语言的字符放在相邻的位置(比如汉字放一起、韩文放一起、日文放一起)。这些个“相邻的位置”,就叫做“区段”(Block)。

于是产生了两种办法。

第一种叫“增补区段”(Supplement Block),说白了就是提前预留出来的位置。例如人们今天发现一门新的语言,叫“思否语”(我编的 ?),目前出土的文献里仅能确定其中 20 个字符,但根据历史记载发现它其实可能有 50 个字符、只不过剩下 30 个字符长啥样现在还不知道。那么就先把确定的这 20 个字符编好码,然后后面留好 30 个空、有编码但没字符,等着以后再补充。这就是所谓的增补区段。

第二种叫“扩展区段”(Extended Block),说白了就是后面额外加进去的。因为一来增补区段也不一定够用,二来可能甚至提前没想到、所以压根没预留出增补区段。比如汉字今天要新加一个字符进去,可原来表示汉字的区段后面已经没有空位可以让我加了、而又不可能为了加这一个字符就把后面所有本来已经编号好的字符统统往后移位,那怎么办?那就只能拆开了呗,在后面再找没分配的地方继续加。加了第一次,那就有了 Extended-A;再加一次,那就有了 Extended-B;等等等等。

以上是 UTF8编码问题 的全部内容, 来源链接: utcz.com/p/944543.html

回到顶部