Unicode字符集及其编码实现

寒江蓑笠翁大约 41 分钟技术日志每日发现字符集编码

Unicode字符集及其编码实现

本文主要介绍Unicode字符集和它的几个实现UTF-8,UTF-16,UTF-32


在日常的写代码过程中,想必或多或少都跟Unicode打过交道,UTF-8,ISO-8859-1,UTF-16等编码出现的次数相当多,例如项目中的配置文件的编码问题,一个人打开可以正常查看并写入了配置,而另一个人打开后看到的就全是乱码,这种问题实际上也只是编码不同而造成的问题类型之一,为了能更好的去解决这类问题,所以就有必要了解相关知识。

基本概念

在了解本文的内容之前,以下基本概念需要了解。

字节

一个字节占八个比特位,它是字符大小的基本单位。

字符

字符(character),在计算机科学中,一个字符是一个单位的字形,类字形单位或符号的基本信息,可以理解为各种文字和符号的总称。它可以是中文汉字:你,也可以是英文字母:Y,或者是一个标点符号:!,还可以是一个emoji表情:🥙,以及一些不可见的控制符号。不同类型的字符在计算机存储中占用的大小可能会有所不同,比如一个英文字符通常只占用一个字节,但是一个中文字符通常占用三个字节。

字符集

字符集(character set),指某一类字符的集合。字符集会收录某一类特定的字符,比如GB2312字符集是中国国家标准总局发布的,它收录了共7445个字符,其中有六千多个汉字。不同的字符集包含的字符类型不同,在计算机上的编码方式也不同,不过具体的编码方式并不由字符集来指定和实现,字符集的作用是收录字符而不是对字符进行编码。常见的字符集有ASCII字符集,Big5字符集,Unicode字符集。

字符编码

字符编码(character encoding),字符编码就是字符映射规则。众所周知计算机只认识0和1,那么一个字符最终还是要被转换成二进制形式才能方便计算机存储和传输,字符编码要干的就是将字符以某种规则转换成计算机可以理解的二进制形式。最常见和最简单的字符编码就是ASCII编码,它规定用一个字节的低七位去编码字符,例如小写字母a的经过ASCII编码后的二进制形式就是01100001,十进制形式就是97。一般来说,一个字符集可能会有多种编码规则,不同的字符集拥有不同的编码规则。如果一个文本文件是用UTF-8进行编码的,那么在解码的时候就也应该使用UTF-8的规则,如果使用了GBK或者Big5编码的规则进行解码,就只会得到一串人类无法阅读的乱码。

提示

大部分的编码都兼容ASCII字符集,不过也有少部分不兼容,比如UTF-16编码,UTF-32编码。

编码空间

编码空间(encoding space)或者又叫码位空间,简单说就是包含所有字符的表的维度。比如说GB2312的编码空间是94x94,因为它总共就只有94x94个码位。同理ISO8859-1有256个码位,所以它的编码空间是256,也可以说是8比特。其实它的表示方式有很多种,总的来说都是在表达字符集所能容纳的字符数量。

码点

码点(code point)又称码位,指的是编码空间中的一个位置。对于一个字符而言,它在编码空间也就是字符集中所占用的码位叫码位值(有点拗口,其实两个都是一个概念)。码位值是可查的,例如在Unicode字符集中,汉字“中”的码点就是U+4E2D。


ASCII

ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于罗马字母表的一套字符集,发布于1967年,因为美国的主流语言是英语,ASCII字符集所包含的字符也只有英文字符,它总共有128个字符。

ASCII字符集的一部分
ASCII字符集的一部分

提示

如果想要查看更完整的ASCII字符集可以前往ASCII码对照表open in new window

ASCII采用的是单字节来表示字符,一个字节有八位,ASCII只有128个字符也就是2的7次方,相当于八位里面只有七位是有用的,所以在ASCII二进制形式中最高位默认为0,就比如第一个字符是空字符它的二进制形式是0000 0000,第128个字符是DEL字符,二进制形式是0111 1111。计算机起源于美国,早期只有美国科学家在使用这些,足够满足他们的使用。

随着计算机技术的不断发展,世界上的各个国家都引进了计算机,ASCII的局限性就体现出来了,世界上的国家有非常多,有些国家使用的语言甚至不止一种。ASCII所包含的字符总共只有128个,肯定是无法表达所有的语言的,于是欧洲将ASCII中字符闲置的最高位利用起来,对ASCII进行了拓展到了256个字符,称为EASCII(Extend ASCII),但其实256个字符也不足以统一整个欧洲的语言字符。

于是后来规定,将这256个字符中的前128个字符用于收录ASCII中的字符,也就说前128个字符与ASCII完全一致,而后128个字符根据欧洲不同的地区而收录不同的字符,这就是后来的ISO 8859系列标准(ISO/IEC 8859open in new window),下面列出一小部分:

  • ISO8859-1 字符集,也就是 Latin-1,收集了西欧字符。

  • ISO8859-2 字符集,也称为 Latin-2,收集了东欧字符。

  • ISO8859-3 字符集,也称为 Latin-3,收集了南欧字符。

  • ISO8859-4 字符集,也称为 Latin-4,收集了北欧字符。

这样改进了后,欧洲不同地区使用不同的字符集,就可以满足使用了,但是这也仅仅只是满足欧洲语言体系的使用而已,要知道光是中文汉字的数量都有十万多个,于是就有了下面要讲的汉字字符集。

汉字字符集

汉字字符集中,简体字符集中有国标系列字符集,繁体字符集有Big5。

GB2312

GB,就是”国标“的拼音GuoBiao的首字母。GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,它的全名叫《国家标准信息交换用汉字编码字符集-基本集》。在1981年5月1日开始使用。GB2312编码共收录汉字6763个,其中一级汉字3755个,二级汉字3008个。同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符,前往GB2312查表open in new window可以前往查询GB2312编码表。

分区编码

GB2312对收录的字符的表示是分区进行的,一共94个区,每个区有94个位,共有8836个位,这种表示方式称为区位码。下面展示前两个区的字符表。

01 0 1 2 3 4 5 6 7 8 9

0     、 。 · ˉ ˇ ¨ 〃 々

1 — ~ ‖ … ‘ ’ “ ” 〔 〕
2 〈 〉 《 》 「 」 『 』 〖 〗
3 【 】 ± × ÷ ∶ ∧ ∨ ∑ ∏
4 ∪ ∩ ∈ ∷ √ ⊥ ∥ ∠ ⌒ ⊙
5 ∫ ∮ ≡ ≌ ≈ ∽ ∝ ≠ ≮ ≯
6 ≤ ≥ ∞ ∵ ∴ ♂ ♀ ° ′ ″
7 ℃ $ ¤ ¢ £ ‰ § № ☆ ★
8 ○ ● ◎ ◇ ◆ □ ■ △ ▲ ※
9 → ← ↑ ↓ 〓

02 0 1 2 3 4 5 6 7 8 9
0   ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ
1 ⅹ       ⒈ ⒉ ⒊
2 ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔
3 ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⑴ ⑵ ⑶
4 ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀
5 ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ① ② ③
6 ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩   ㈠
7 ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ 
8  Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ
9 Ⅹ Ⅺ Ⅻ

下面是分区的规则:

  • 每一个区的第0位不记录字符
  • 01-09区收录除汉字外的682个字符。
  • 10-15区为空白区,没有使用。
  • 16-55区收录3755个一级汉字,按拼音排序。
  • 56-87区收录3008个二级汉字,按部首/笔画排序。
  • 88-94区为空白区,没有使用。

GB2312既指GB2312字符集,也指GB2312编码。它采用的是双字节编码,第一个字节为高字节,第二个字节为低字节,高字节用于记录字符对应的94个区中的每一个区,低字节用于记录字符一个区中对应的94个位。例如汉字"啊",是GB2312字符集中的第一个汉字,位于16区的01位,对应的区位码就是1601,GB2312的区位码范围就是0101-9494。

区号和位号分别加上0xA0就是GB2312编码,比如1601的区号是16,位号是01,转换成十六进制就是10和01,高字节为0xA0+0x10=0xB0,低字节为0xA0+0x01=0xA1,高低字节组合起来就是0xB0A1,所以汉字“啊”的GB2312编码就是B0A1。GB2312编码范围:A1A1-FEFE,其中汉字的编码范围为B0A1-F7FE,第一字节0xB0-0xF7(对应区号:16-87),第二个字节0xA1-0xFE(对应位号:01-94)。

GB2312字符集总共收录了八千多个字符,当时国内的计算机需求并不旺盛,GB2312所以可以满足基本的日常使用。但是随着技术的发展也明显不够用了,于是就有了后来的GBK。

Big5

“大五码”(Big5)是由台湾财团法人信息产业策进会为五大中文套装软件所设计的中文共通内码,在1983年12月完成公告,隔年3月,信息产业策进会与台湾13家厂商签定“16位个人电脑套装软件合作开发(BIG-5)项目(五大中文套装软件)”,因为此中文内码是为台湾自行制作开发之“五大中文套装软件”所设计的,所以就称为Big5中文内码。

Big5是最常用的繁体中文字符集,共收录13,060个汉字,最初流行于港澳台地区,后面被收录进了GBK。Big5字符集的双字节的编码方式,分高低两个字节,然后组成Big5编码,图示如下:

CJK

中日韩统一表意文字(英语:CJK Unified Ideographs),也称统一汉字(英语:Unihan),目的是要把分别来自中文、日文、韩文、越南文、壮文中,起源相同、本义相同、形状一样或稍异的表意文字,赋予其在UISO 10646及万国码标准中相同编码。此计划原本只包含中文、日文及韩文中所使用的汉字,旧称中日韩(CJK)统一表意文字(Unified Ideographs)。后来,此计划加入了越南文的喃字,所以合称中日韩越(CJKV)统一表意文字。

GBK

GBK,是”国标扩展“拼音GuoBiaoKuoZhan的首字母。1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,所以完全兼容GB2312字符集,除此之外也支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字(包含部分CJK),还包含了Big5字符集,共收录了21886个字符。

编码

在编码上GBK同样也还是采用的双字节编码,范围在0x8140-0xFEFE之间,高字节在0x81-0xFE范围内,低字节在0x40-0xFE范围内。GBK中总共有三大区:

  • 汉字区
    • GB2312汉字区
    • GB13000.1扩充汉字区
  • 图形符号区
    • GB2312非汉字区
    • GB13000.1扩充的非汉字区
  • 自定义区

下面展示一些GBK中81区到8F区的字符表

81 0 1 2 3 4 5 6 7 8 9 A B C D E F
4 丂 丄 丅 丆 丏 丒 丗 丟 丠 両 丣 並 丩 丮 丯 丱
5 丳 丵 丷 丼 乀 乁 乂 乄 乆 乊 乑 乕 乗 乚 乛 乢
6 乣 乤 乥 乧 乨 乪 乫 乬 乭 乮 乯 乲 乴 乵 乶 乷
7 乸 乹 乺 乻 乼 乽 乿 亀 亁 亂 亃 亄 亅 亇 亊
8 亐 亖 亗 亙 亜 亝 亞 亣 亪 亯 亰 亱 亴 亶 亷 亸
9 亹 亼 亽 亾 仈 仌 仏 仐 仒 仚 仛 仜 仠 仢 仦 仧
A 仩 仭 仮 仯 仱 仴 仸 仹 仺 仼 仾 伀 伂 伃 伄 伅
B 伆 伇 伈 伋 伌 伒 伓 伔 伕 伖 伜 伝 伡 伣 伨 伩
C 伬 伭 伮 伱 伳 伵 伷 伹 伻 伾 伿 佀 佁 佂 佄 佅
D 佇 佈 佉 佊 佋 佌 佒 佔 佖 佡 佢 佦 佨 佪 佫 佭
E 佮 佱 佲 併 佷 佸 佹 佺 佽 侀 侁 侂 侅 來 侇 侊
F 侌 侎 侐 侒 侓 侕 侖 侘 侙 侚 侜 侞 侟 価 侢

82 0 1 2 3 4 5 6 7 8 9 A B C D E F
4 侤 侫 侭 侰 侱 侲 侳 侴 侶 侷 侸 侹 侺 侻 侼 侽
5 侾 俀 俁 係 俆 俇 俈 俉 俋 俌 俍 俒 俓 俔 俕 俖
6 俙 俛 俠 俢 俤 俥 俧 俫 俬 俰 俲 俴 俵 俶 俷 俹
7 俻 俼 俽 俿 倀 倁 倂 倃 倄 倅 倆 倇 倈 倉 倊
8 個 倎 倐 們 倓 倕 倖 倗 倛 倝 倞 倠 倢 倣 値 倧
9 倫 倯 倰 倱 倲 倳 倴 倵 倶 倷 倸 倹 倻 倽 倿 偀
A 偁 偂 偄 偅 偆 偉 偊 偋 偍 偐 偑 偒 偓 偔 偖 偗
B 偘 偙 偛 偝 偞 偟 偠 偡 偢 偣 偤 偦 偧 偨 偩 偪
C 偫 偭 偮 偯 偰 偱 偲 偳 側 偵 偸 偹 偺 偼 偽 傁
D 傂 傃 傄 傆 傇 傉 傊 傋 傌 傎 傏 傐 傑 傒 傓 傔
E 傕 傖 傗 傘 備 傚 傛 傜 傝 傞 傟 傠 傡 傢 傤 傦
F 傪 傫 傭 傮 傯 傰 傱 傳 傴 債 傶 傷 傸 傹 傼
.
.
.
8F 0 1 2 3 4 5 6 7 8 9 A B C D E F
4 廆 廇 廈 廋 廌 廍 廎 廏 廐 廔 廕 廗 廘 廙 廚 廜
5 廝 廞 廟 廠 廡 廢 廣 廤 廥 廦 廧 廩 廫 廬 廭 廮
6 廯 廰 廱 廲 廳 廵 廸 廹 廻 廼 廽 弅 弆 弇 弉 弌
7 弍 弎 弐 弒 弔 弖 弙 弚 弜 弝 弞 弡 弢 弣 弤
8 弨 弫 弬 弮 弰 弲 弳 弴 張 弶 強 弸 弻 弽 弾 弿
9 彁 彂 彃 彄 彅 彆 彇 彈 彉 彊 彋 彌 彍 彎 彏 彑
A 彔 彙 彚 彛 彜 彞 彟 彠 彣 彥 彧 彨 彫 彮 彯 彲
B 彴 彵 彶 彸 彺 彽 彾 彿 徃 徆 徍 徎 徏 徑 従 徔
C 徖 徚 徛 徝 從 徟 徠 徢 徣 徤 徥 徦 徧 復 徫 徬
D 徯 徰 徱 徲 徳 徴 徶 徸 徹 徺 徻 徾 徿 忀 忁 忂
E 忇 忈 忊 忋 忎 忓 忔 忕 忚 忛 応 忞 忟 忢 忣 忥
F 忦 忨 忩 忬 忯 忰 忲 忳 忴 忶 忷 忹 忺 忼 怇

例如第一个汉字丂位于81区,位置在4行0列,所以它的GBK编码为8140。

GB18030

2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。2005年11月8日,发布了修订版本:GB18030-2005,共收录汉字七万余个。2022年7月19日,发布了第二次修订版本:GB18030-2022,收录汉字总数八万余个。

编码

GB18030编码向下兼容GBK编码和GB2312编码,它采用了单字节、双字节、四字节分段编码方案。

  • 单字节部分采用GB/T 11383的编码结构与规则,使用0x00至0x7F码位共128个字符(对应ASCII码位)。

  • 双字节部分,首字节码位从0x81至0xFE,尾字节码位分别是0x40至0x7E和0x80至0xFE。

  • 四字节部分采用GB/T 11383未采用的0x30到0x39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0x81308130到0xFE39FE39。其中第一、三个字节编码码位均为0x81至0xFE,第二、四个字节编码码位均为0x30至0x39

下表是GB18030-2022收录的汉字。

Unicode

Unicode,它是由Unicode联盟创建并维护的,中文名为统一码,由于它收录了世界上绝大多数国家的字符所以又称作万国码。它提供了一种跨平台的乱码问题解决方案,Unicode使用数字来处理字符,为每一个字符指定一个唯一的代码,并将字符视觉上的任务交给其他软件来自行处理。Unicode的编码空间从U+0000到U+10FFFF,共有1,112,064个码位可用来映射字符。

Unicode是当今互联网最流行的字符集发展自USC(ISO/IEC 10646),首个版本发布于1991年10月,最初的目标是为了解决ISO 8859-1所不能解决的计算机多语问题(即一台电脑可以处理多个语言混合的情况),最新版本的Unicode15发布于2022年9月,共收录了161种文字和14万多个字符,现在成为了国际标准通用字符集。

UTF指的是Unicode Transformation Format中文称为Unicode转换格式,Unicode的编码实现方式中最流行的当属于UTF-8,除此之外还有UTF-16和不怎么常用的UTF-32,以及被淘汰了的UTF-7。

UTF8

UTF-8(8-bit Unicode Transformation Format),是由Ken Thompson和Robo Pike(他们两个在后来还共同设计了Go语言)共同设计并提出。UTF8是基于Unicode实现的可变长编码,在日后随着计算机的普及,UTF8的编码的使用率高达95%以上,以至于IETF互联网工程小组甚至要求所有的互联网协议都必须支持UTF8。

提示

Mysql字符编码集中,同时支持utf8和uftmb4,前者一个字符最多占用3个字节,后者一个字符最多占用4个字节,utf8mb4才是utf8的完整实现。

UTF-8最初使用一至六个字节为每个字符编码,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节,UTF-8对于所有常用的字符差不多都可以采用三个字节来表示。在UTF-8编码中,对于一个任意字节B,有着如下规则:

  • 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B独立的表示一个字符(ASCII码)
  • 如果B的第一位为1,第二位为0,则B为一个多字节字符中的一个字节(非ASCII字符)
  • 如果B的前两位为1,第三位为0,则B为两个字节表示的字符中的第一个字节
  • 如果B的前三位为1,第四位为0,则B为三个字节表示的字符中的第一个字节
  • 如果B的前四位为1,第五位为0,则B为四个字节表示的字符中的第一个字节

通过第二条规则可以很轻易的判断出该字符是不是一个ASCII字符。对于一个任意字符,如果它占用的字节大于1,那么除了第一个字节外,其余字节都以10开头,如下表。

码点的位数码点起值码点终值字节序列Byte 1Byte 2Byte 3Byte 4Byte 5Byte 6
7U+0000U+007F10xxxxxxx
11U+0080U+07FF2110xxxxx10xxxxxx
16U+0800U+FFFF31110xxxx10xxxxxx10xxxxxx
21U+10000U+1FFFFF411110xxx10xxxxxx10xxxxxx10xxxxxx
26U+200000U+3FFFFFF5111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
31U+4000000U+7FFFFFFF61111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx

例如中文简体汉字“爱”的Unicode码点为U+7231,位于U+0800 - U+FFFF范围内,所以爱的UTF-8编码需要三个字节,接下来将0x7231转换成二进制形式,从最低位开始每一次取6位,最后一次取成4位,不够的补0,最后就是如下二进制

0111 001000 110001

根据规则填入后就变成了如下,可以看出就是三个字节的大小

1110xxxx 10xxxxxx 10xxxxxx
11100111 10001000 10110001

不过一般用于表述时的使用形式是十六进制

E7 88 B1

UTF-8编码的字符可以很轻易的通过第一个字节得知该字符占用的字节数。

UTF16

UTF-16是Unicode字符集的一种变长编码实现方式,它把Unicode字符集的抽象码位映射成16位长的整数序列,用于数据存储和传递,它使用两个或四个字节来编码字符,编码规则如下,已知Unicode范围是U+0000 - U+10FFFF。

码点起值码点终值字节规则
U+0000U+D7FF2UTF16-编码就是Unicode码点,不进行任何转换
U+E000U+FFFF2UTF16-编码就是Unicode码点,不进行任何转换
U+10000U+10FFFF4码位减去0x10000,转换成二进制,得到20位二进制序列。高10位的值加上0xD800形成一个16个序列,低十位的值加上DC00形成一个16位序列,然后再拼成一个完整的二进制序列,就得到了一个Unicode字符的UTF-16编码。
U+D800U+DFFF不对应任何字符,算作编码错误

比如美元符号"$",它的Unicode码点是U+0024,它并不在U+10000到U+10FFFF的范围内,所0024就是它的UTF-16编码,占用两个字节。

再比如符号𐐷的码点是U+10437,二进制序列是

0001 0000 01 00 0011 0111

高十位加上0xD800,低十位加上0xDC00,就变成了下方的序列

1101 1000 0000 0001 1101 1100 0011 0111

它的十六进制形式是

D801 DC37

它的UTF-16编码占用4个字节,这种编码方式并不兼容ASCII码。

UTF32

UTF-32是固定长度编码,每个码位使用4个字节,Unicode码位直接存储位UTF-32编码,没有任何规则。这种编码几乎没有使用,因为它极大的浪费了空间,由UTF-32所编码的文件占用大概是UTF-16的两倍,UTF-8的四倍。

它唯一的优点就是定索引非常方便,因为是定长编码,字符位置直接使用十进制数,每加一就是下一个字符。

其他概念

字节序

对于UTF序列编码而言,UTF-8不存在字节序问题,因为它的编码单元就是一个字节,没有高低位之分,一次取一个字节就完事。但是UTF-16和UTF-32不同,它至少每次要处理两个字节或4个字节,这就涉及到了字节序的问题。例如Unicode字符集中的汉字“你”,UTF-8编码为EDBDA0,这是大端序,小端序就是低位在低地址,高位在高地址,就是反过来0ADBDE,反正读取时都是从低地址开始读,结果都是一样的。所以这并不会产生什么问题。

汉字”你“的UTF-16的大端编码是4F60,小端是604F,它的单位是两个字节,读取时都是从低地址开始读的,不知道大小端序的话,就不清楚谁是高位字节,谁是低位字节,如果本身是大端序,按照小端序读取的话就成了604F,这完全变成另一个字符了,UTF-32同理。

所以应该显式的告诉计算机是大端序还是小端序,因此UTF-16编码分为UTF-16BE和UTF-16LE,同理也UTF-32也分为UTF-32BE和UTF-32LE。

BOM

BOM(byte order mark),中文名为字节序标记。UTF系列的文件通常用零宽非换行空格符(U+FEFF)用于标记大小端序。UTF-8文件有时候也会用到它,不过仅仅只是用来标记该文件是UTF-8文件,它的UTF-8编码是EF BB BF。对于UTF-16的文件而言,标记是FE FF,就是大端序,FF FE就是小端序。

据说给UTF-8文件加BOM头是微软为了兼容旧系统的编码,但是这可能在其他的操作系统就不一定适用了,比如Unix,因为他们的设计原则是“文档中的所有字符必须可见”,所以在windows系统上编写的shell脚本,在unix上就不一定能运行,一些源代码文件也可能会出现编译问题。

总结

一图胜千言,下面这张图可以很直观的看出各个字符集之间的关系。

国标系列的GB字符集从始至终都向下兼容,在后续更新中慢慢的还囊括了CJK,Big5等其他语种的字符集,但可能并不兼容。ISO8859是早期欧洲为了方便因国家之间语言的细微差异而在ASCII基础之上衍生的一系列字符集。Unicode与GB18030相互不兼容,两者都想收录世界上的绝大多数语言的文字和字符,只不过目前来看Unicode更流行一些,Unicode同时还兼容ISO8859-1。

上次编辑于:
贡献者: 246859