热门问题
时间线
聊天
视角
Unicode
计算机行业标准 来自维基百科,自由的百科全书
Remove ads
Unicode,全称为Unicode标准(The Unicode Standard),其官方机构Unicode联盟所用的中文名称为统一码[1],又译作万国码、统一字符码、统一字符编码[2],是信息技术领域的业界标准,其整理、编码了世界上大部分的文字系统,使得电脑能以通用划一的字符集来处理和显示文字,不但减轻在不同编码系统间切换和转换的困扰,更提供了一种跨平台的乱码问题解决方案。Unicode由非营利机构Unicode联盟(Unicode Consortium)负责维护,该机构致力让Unicode标准取代既有的字符编码方案,因为既有方案编码空间有限,亦不适用于多语环境。
Remove ads
Unicode伴随着通用字符集ISO/IEC 10646的标准而发展,同时也以书本的形式[3]对外发表。Unicode至今仍在不断增修,每个新版本都加入更多新的字符。目前最新的版本为2024年9月公布的16.0.0[4],已经收录超过15万个字符(第十万个字符在2005年获采纳)。Unicode标准不仅仅只是为文字指定代码。除了涵盖视觉上的字形、编码方法、标准的字符编码资料外,联盟官方出版品还包含了关于各书写系统的细节及呈现方式,如规范化的准则、拆分、测序、绘制、双向文本显示、书写方向、字符特性(如大小写字母)等等。此外还提供参考资料和视觉图像,以帮助开发者和设计师正确应用标准。
Unicode备受认可,为ISO纳入国际标准,成为通用字符集,即 ISO/IEC 10646。Unicode兼容ISO/IEC 10646,能完整对应各个版本标准[5][6]。Unicode广泛应用于电脑软件的国际化与本地化过程。很多新科技,如可扩展置标语言(Extensible Markup Language,简称:XML)、Java编程语言以及现代操作系统,都采用Unicode来编码。Unicode最普遍的编码格式是和ASCII兼容的UTF-8,以及和UCS-2兼容的UTF-16。
Remove ads
起源与发展
Unicode为解决传统字符编码方案的局限而产生,例如ISO 8859-1所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都有共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。
Unicode包含了不同写法的字,如“ɑ/a”、“強/强”、“戶/户/戸”。然而在汉字方面引起了一字多形的认定争议,详见中日韩统一表意文字。
在文字处理方面,统一码为每一个字符而非字形定义唯一的代码(即一个整数)。换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器。
目前,几乎所有电脑系统都支持基本拉丁字母,并各自支持不同的其他编码方式。Unicode为了和它们相互兼容,其首256个字符保留给ISO 8859-1所定义的字符,使既有的西欧语系文字的转换不需特别考量;并且把大量相同的字符重复编到不同的字符码中去,使得旧有纷杂的编码方式得以和Unicode编码间互相直接转换,而不会丢失任何信息。举例来说,全角格式区段包含了主要的拉丁字母的全角格式,在中文、日文、以及韩文字形当中,这些字符以全角的方式来呈现,而不以常见的半角形式显示,这对竖排文字和等宽排列文字有重要作用。
在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面里的所有字符,要用四个数字(即2字节,共16位,例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五或六个数字。旧版的Unicode标准使用相近的标记方法,但却有些微小差异:在Unicode 3.0里使用“U-”然后紧接着八个数字,而“U+”则必须随后紧接着四个数字。
Remove ads
位于美国加州的Unicode组织允许任何愿意支付会费的公司和个人加入,其成员包含了主要的电脑软硬件厂商,例如Adobe系统、苹果公司、惠普、IBM、微软、施乐等。
20世纪80年代末,组成Unicode组织的商业机构,和国际合作的国际标准化组织在电脑普及和信息国际化的前提下,分别各自成立了Unicode组织[7]和ISO-10646工作小组。他们不久便发现对方的存在,而大家工作目的一致。1991年,Unicode Consortium与ISO/IEC JTC1/SC2同意保持Unicode码表与ISO 10646标准保持兼容并密切协调各自标准进一步的扩展。虽然实际上两者的字集编码相同,但本质上两者确为不同的标准。Unicode 1.1对应于ISO 10646-1:1993,Unicode 3.0对应于ISO 10646-1:2000,Unicode 3.2对应于ISO 10646-2:2001,Unicode 4.0对应于ISO 10646:2003,Unicode 5.0对应于ISO 10646:2003及附录1–3。
Unicode自2.0版本开始保持了向后兼容,即新版本仅增加字符,原有字符不会删除或更名。但从Unicode 14.0起,既有的区段可扩展或缩减(必须在没有字符使用空间的前提下,若已有字符占用空间不可缩减区段),第一个自Unicode 1.1以来扩展的既有区段为阿洪姆文(Ahom)。[8]
统一码联盟在1991年首次发布了The Unicode Standard。Unicode的开发结合了国际标准化组织所制定的ISO/IEC 10646,即通用字符集。Unicode与ISO/IEC 10646在编码的运作原理相同,但The Unicode Standard包含了更详尽的实现信息、涵盖了更细节的主题,诸如比特编码(bitwise encoding)、校对以及呈现等。The Unicode Standard也枚举了诸多的字符特性,例如必须支持两种阅读方向的字符(由左至右或由右至左的文字阅读方向,例如阿拉伯文是由右至左)。Unicode与ISO/IEC 10646两个标准在术语上的使用有些微的不同。[5]
Unicode的第十万个字符(用于马拉雅拉姆语)于2005年引入标准。
Remove ads
截至目前的Unicode各版本及其发布时间如下:
其中,因应2019冠状病毒病疫情,Unicode 14.0由2021年3月延后至2021年9月发布[9]。
Remove ads
Unicode的编码和实现
大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。
《The Unicode Standard Version 6.2 – Core Specification》[44] 文档给出了Unicode的十大设计原则:
- Universality:提供单一、综合的字符集,编码一切现代与大部分历史文献的字符。
- Efficiency:易于处理与分析。
- Characters, not glyphs:字符,而不是字形。
- Semantics:字符要有良好定义的语义。
- Plain text:仅限于文本字符。
- Logical order:默认内存表示是其逻辑序。
- Unification:把不同语言的同一书写系统(scripts)中相同字符统一起来。
- Dynamic composition:附加符号可以动态组合。
- Stability:已分配的字符与语义不再改变。
- Convertibility:Unicode与其他著名字符集可以精确转换。
统一码的编码方式与ISO 10646的通用字符集概念相对应。目前实际应用的统一码版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216(即65536)个字符。基本满足各种语言的使用。实际上当前版本的统一码并未完全使用这16位编码,而是保留了大量空间以作为特殊使用或将来扩展。
上述16位统一码字符构成基本多文种平面。最新(但未实际广泛使用)的统一码版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与UCS-4保持一致。未来版本会扩充到ISO 10646-1实现级别3,即涵盖UCS-4的所有字符。UCS-4是更大而尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示231个字符,完全可以涵盖一切语言所用的符号。
基本多文种平面的字符的编码为U+hhhh,其中每个h代表一个十六进制数字,与UCS-2编码完全相同。而其对应的4字节UCS-4编码后两个字节一致,前两个字节则所有位均为0。
Remove ads
Unicode的实现方式不同于编码方式。一个字符的Unicode编码确定。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。
例如,如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1识别。这样对以7位ASCII字符为主的西文文档就大幅节省了编码长度(具体方案参见UTF-8)。类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法转换。
再如,如果直接使用与Unicode编码一致(仅限于BMP字符)的UTF-16编码,由于每个字符占用了两个字节,在麦金塔电脑(Mac)机和个人电脑上,对字节顺序的理解不一致。这时同一字节流可能会解释为不同内容,如某字符为十六进制编码4E59,按两个字节拆分为4E和59,在Mac上读取时是从低字节开始,那么在Mac OS会认为此4E59编码为594E,找到的字符为“奎”,而在Windows上从高字节开始读取,则编码为U+4E59的字符为“乙”。就是说在Windows下以UTF-16编码保存一个字符“乙”,在Mac OS环境下开启会显示成“奎”。此类情况说明UTF-16的编码顺序若不加以人为定义就可能发生混淆,于是在UTF-16编码实现方式中使用了大端序(Big-Endian,简写为UTF-16 BE)、小端序(Little-Endian,简写为UTF-16 LE)的概念,以及可附加的字节顺序记号解决方案,目前在个人电脑上的Windows系统和Linux系统对于UTF-16编码默认使用UTF-16 LE。(具体方案参见UTF-16)
此外Unicode的实现方式还包括UTF-7、Punycode、CESU-8、SCSU、UTF-32、GB18030等,这些实现方式有些仅在一定的国家和地区使用,有些则属于未来的规划方式。目前通用的实现方式是UTF-16小端序(LE)、UTF-16大端序(BE)和UTF-8。在微软公司Windows XP附带的记事本(Notepad)中,“另存为”对话框可以选择的四种编码方式除去非Unicode编码的ANSI(对于英文系统即ASCII编码,中文系统则为GB2312或Big5编码)外,其余三种为“Unicode”(对应UTF-16 LE)、“Unicode big endian”(对应UTF-16 BE)和“UTF-8”。
目前辅助平面的工作主要集中在第二和第三平面的中日韩统一表意文字,因此包括GBK、GB18030、Big5等简体中文、繁体中文、日文、韩文以及越南喃字的各种编码与Unicode的协调性受重点关注。考虑到Unicode最终要涵盖所有的字符。从某种意义而言,这些编码方式也可视作Unicode的出现于其之前的既成事实的实现方式,如同ASCII及其扩展Latin-1一样,后两者的字符在16位Unicode编码空间中的编码第一字节各位全为0,第二字节编码与原编码完全一致。但上述东亚语言编码与Unicode编码的对应关系要复杂得多。
Remove ads
Unicode 将编码空间分成 17 个平面,以 0 到 16 编号。
第 0 平面(或者说基本多文种平面)中的码点,都可以用一个 UTF-16 单位来编码,或者以 UTF-8 来编码的话,会使用一、二或三个字节。而第 1 到 16 平面(或称辅助平面)中的码点,UTF-16 会以代理对的方式来使用,而 UTF-8 则会编码成 4 个字节。
在每个平面中,会先将相关的字符集结为区段的形式。虽然区段可以是任意大小,但会以 16 个码点的倍数,且通常是 128 个码点的倍数。而一份文稿中使用到的区段,可能会散布在多个区段中。
非Unicode环境
在非Unicode环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性地部分解决这一问题,即通过指定的转换表将非Unicode的字符编码转换为同一字符对应的系统内部使用的Unicode编码。可以在“语言与区域设置”中选择一个代码页作为非Unicode编码所采用的默认编码方式,如936为简体中文GB码,950为繁体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。只有完全采用统一编码才能彻底解决这些问题,但目前尚无法做到这一点。
代码页技术现在广泛为各种平台所采用。UTF-7的代码页是65000,UTF-8的代码页是65001。
XML和Unicode
XML及其子集XHTML采用UTF-8作为标准字符集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的网页,只要电脑本身安装有合适的字体即可。可以利用&#
nnn;
的格式显示特定的字符。nnn代表该字符的十进制Unicode代码。如果采用十六进制代码,在编码之前加上x
字符即可。但部分旧版本的浏览器可能无法识别十六进制代码。
过去电脑编码的8位标准,使每个国家都只按国家使用的字符而编定各自的编码系统;而对于部分字符系统比较复杂的语言,如越南语,又或者东亚国家的大型字符集,都不能在8位的环境下正常显示。
只是最近才有在文本中对十六进制的支持,那么旧版本的浏览器显示那些字符或许可能有问题——大概首先会遇到的问题只是在对于大于8位Unicode字符的显示。解决这个问题的普遍做法仍然是将其中的十六进制码转换成一个十进制码(例如:♠
用♠
代替♠
)。
也有一些字符集标准将一些常用的标志存放在字符内码外面,那么你可能使用像—
这样的文本标志来表示一个长划(—)的情况,即使它的字符内码已经使用,这些标准也不包含那个字符。
然而部分由于Unicode版本发展原因,很多浏览器只能显示UCS-2完整字符集,也即现在使用的Unicode版本中的一个小子集。下表可以检验您的浏览器如何显示各种Unicode代码:
一些多语言支持的网页浏览器,比如Microsoft Windows系统的Internet Explorer 5.5及以上版本,以及跨平台的浏览器Mozilla/Netscape 6,可以在安装时根据需要动态地使用相应的字符集,预先安装了合适的语言包,就可以同时显示页面上的各种Unicode字符。Internet Explorer 5.5还提出用户可以在需要新字体时,即装即用。另外的浏览器如Netscape Navigator 4.77,则只能显示跟页面编码相应字符集中的文字。当你使用后一种浏览器时,你不大可能预先安装所有的字体,即使有了字体,浏览器也不一定能将这些字体完全应用起来。可能遇到的情况是,这种浏览器只能够显示部分文字,因为它们是按照标准编码,尽管理论上在兼容的系统中,只要有了相应的Code2000字体,就可以正确显示。一种变通的办法,是将某些少见的字符,通过“名称实体引用”的方式来使用。
Remove ads
输入方法
不同的操作系统,各有直接输入Unicode字符的方法:
- 基于X Window System的Linux系统,如Ubuntu的Gnome Terminal,首先按下Ctrl+Shift+U,然后输入16进制Unicode数,如interpunct间隔符输入00b7,最后按空格键;
- Microsoft Windows系统,按下Alt+0183表示interpunct间隔符。
截至2011年10月,可以使用微软拼音2003或2007版本、仓颉输入法第三代第五代第六代版本、郑码Unicode版本、海峰五笔9.3版本、新注音输入法和VimIM输入。
- 微软拼音在输入法启动状态下,单击语言栏上的“功能菜单”按钮,指向“辅助输入法”即可发现“Unicode码输入方式”,利用它可以直接输入Unicode相应十六进制值的方式输入相应文字。例如中文“胥”输入“5066”,朝鲜文字“셅”输入“c145”(不需要在前面加0x或x)。新版本下也可以输入VUC(大小写不敏感)再输入编码。
- 仓颉输入法已为Unicode汉字、类汉字编码,可以在仓颉输入法方式下通过仓颉码输入方式输入Unicode内的中日韩汉字及韩文。以仓颉输入法第五代为例,例如汉字“㗎”输入“口大口木”,汉字“胥”输入“弓人月”,汉字“㿱”输入“手中木竹水”,朝鲜文字“닮”输入“尸卜尸女口”。由于朱邦复工作室使用的仓颉系统收字比Unicode还多,目前Unicode既有汉字皆已有仓颉编码。
- 郑码已为Unicode汉字、类汉字编码,可以在郑码输入法方式下通过郑码字码输入方式输入Unicode内的中日韩汉字及韩文。例如汉字“㗎”输入“JYJF”,汉字“胥”输入“XIQ”,汉字“㿱”输入“DPXI”,朝鲜文字“길”输入“XIYY”。
- 海峰五笔此输入法已经直接支持透过五笔码输入方式输入Unicode内的任意中日韩汉字,但无法使用键入Unicode码的方式输入。例如汉字(Unicode部分)“㗎”为“keks”,CJK扩展B区的“𣿱”为“iyho”和CJK扩展C区的“𫆦”为“muih”。
- 新注音输入法在输入法启动状态时,打入键盘上的“多功能前导字符键”(即通用键盘上之“`”),第一次使用会弹出说明。输入Unicode字符“胥”则是在键盘上键入“`U5066”。而韩语中的“셅”,则输入“`UC145”。而要输入日制汉字“峠”,则是“`U5CE0”。
- VimIM在Vim环境中,可以直接键入十进制或十六进制Unicode码。既不需要启动输入法,也不需要码表。
- 呒虾米输入法,支持Unicode,以26个英文字母为组字按键,可直接输入符号、日文汉字及平假名、片假名,但汉字部分一般只支持基本繁体中文、简体中文,扩展A区的汉字要另行扩展编码才能输入,扩展B区的汉字尚无编码。
使用Microsoft IME 2007,可以在IME Pad找到Unicode的点击表。点击字符即可输入。选择字体可以预览字符效果。
除了输入法外,操作系统也会提供另外几种方法输入Unicode。像是Windows 2000之后的Windows系统就提供可点击的字符映射表。又或者在Microsoft Word下,按下Alt键不放,使用数字键盘输入0和某个字符的Unicode编码(十进制),再松开Alt键即可得到该字符,如Alt033865会得到Unicode字符葉
。另外,按AltX组合键,Microsoft Word也会将光标前面的字符同其十六进制的四位Unicode编码互相转换。
注释
参考文献
参阅
外部链接
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads