Unicode
维基百科,自由的百科全书
Unicode(統一碼、萬國碼、單一碼)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年裡得到普及。
最新版本的 Unicode 是 2006年7月14日推出的Unicode 5.0.0。
目录 |
[编辑] Unicode 的编码和实现
大概来说,Unicode 编码系统可分为编码方式和实现方式两个层次。
[编辑] 编码方式
Unicode 的编码方式与 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相对应,目前实际应用的 Unicode 版本对应于 UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示 216 即 65536 个字符。基本满足各种语言的使用。实际上目前版本的 Unicode 尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。
上述16位 Unicode 字符构成基本多文种平面(Basic Multilingual Plane, 简称 BMP)。最新(但未实际廣泛使用)的 Unicode 版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与 UCS-4 保持一致。未来版本会扩充到 ISO 10646-1 实现级别3,即涵盖 UCS-4 的所有字符。UCS-4 是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示 231 个字符,完全可以涵盖一切语言所用的符号。
BMP 字符的 Unicode 编码表示为 U+hhhh,其中每个 h 代表一个十六进制数位。与 UCS-2 编码完全相同。对应的4字节 UCS-4 编码后两个字节一致,前两个字节的所有位均为0。
关于 Unicode 和 ISO 10646 及 UCS 的详细关系 ,请参看通用字符集。
[编辑] 实现方式
Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为Unicode转换格式(Unicode Translation 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 编码,由于每个字符占用了两个字节,在Macintosh机和PC机上对字节顺序的理解是不一致的。这时同一字节流可能会被解释为不同内容,如编码为 U+594E 的字符“奎”同编码为 U+4E59 的“乙”就可能发生混淆。于是在 UTF-16 编码实现方式中使用了大尾序(big-endian)、小尾序(little-endian)的概念,以及BOM(Byte Order Mark)解决方案。(具体方案参见UTF-16)
此外 Unicode 的实现方式还包括 UTF-7、Punycode、CESU-8、SCSU、UTF-32等,这些实现方式有些仅在一定的国家和地区使用,有些则属于未来的规划方式。目前通用的实现方式是 UTF-16小尾序(BOM)、UTF-16大尾序(BOM)和 UTF-8。在微软公司Windows XP操作系统附带的记事本中,“另存为”对话框可以选择的四种编码方式除去非 Unicode 编码的 ANSI 外,其余三种“Unicode”、“Unicode big endian”和“UTF-8”即分别对应这三种实现方式。
目前辅助平面的工作主要集中在第二和第三平面的中日韩统一表意文字中,因此包括GBK、GB18030、Big5等简体中文、正体中文、日文、韩文以及越南喃字的各种编码与 Unicode 的协调性被重点关注。考虑到 Unicode 最终要涵盖所有的字符,从某种意义而言,这些编码方式也可视作 Unicode 的出现于其之前的既成事实的实现方式,如同ASCII及其扩展Latin-1一样,后两者的字符在16位 Unicode 编码空间中的编码第一字节各位全为0,第二字节编码与原编码完全一致。但上述东亚语言编码与 Unicode 编码的对应关系要复杂得多。
[编辑] 非 Unicode 环境
在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode 编码。可以在“语言与区域设置”中选择一个代码页作为非 Unicode 编码所采用的默认编码方式,如936为简体中文GBK,950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前尚无法做到这一点。
代码页技术现在广泛为各种平台所采用。UTF-7 的代码页是65000,UTF-8 的代码页是65001。
[编辑] XML 和 Unicode
XML及其子集HTML采用UTF-8作为标准字集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的网页,只要电脑本身安装有合适的字体即可。可以利用&#
nnn;
的格式显示特定的字符。nnn代表该字符的十进制 Unicode 代码。如果采用十六进制代码,在编码之前加上x
字符即可。但部分旧版本的浏览器可能无法识别十六进制代码。
然而部分由于 Unicode 版本发展原因,很多浏览器只能显示 UCS-2 完整字符集也即现在使用的 Unicode 版本中的一个小子集。下表可以检验您的浏览器怎样显示各种各样的 Unicode 代码:
代码 | 字符标准名称 (英语) | 在浏览器上的显示 |
---|---|---|
A |
大写拉丁字母"A" | A |
ß |
小写拉丁字母"Sharp S" | ß |
þ |
小写拉丁字母"Thorn" | þ |
Δ |
大写希腊字母"Delta" | Δ |
Й |
大写斯拉夫字母"Short I" | Й |
ק |
希伯来字母"Qof" | ק |
م |
阿拉伯字母 "Meem" | م |
๗ |
泰文数字 7 | ๗ |
ቐ |
埃塞俄比亚音节文字"Qha" | ቐ |
あ |
日语平假名 "A" | あ |
ア |
日语片假名 "A" | ア |
叶 |
简体汉字 "叶" | 叶 |
葉 |
正体汉字 "葉" | 葉 |
엽 |
韩国音节文字 " Yeob" | 엽 |
[编辑] 輸入Unicode
除了輸入法外,作業系統會提供幾種方法輸入Unicode。像是Windows 2000之後的Windows系統就提供一個可點擊的表。例如在Microsoft Word之下,按下 Alt 鍵不放,输入 0 和某个字符的 Unicode 编码(十进制),再松开 Alt 键即可得到该字符,如Alt + 033865
會得到Unicode字元葉。另外按Alt + X
组合键,MS Word 也会将光标前面的字符同其十六进制的四位 Unicode 编码进行互相转换。 若前述輸入Unicode的方法無法奏效的使用者,您可以考慮安裝微軟公司(Microsoft)所提供的「新注音輸入法」或「新倉頡輸入法」,在輸入狀態下按「`」+「u」,再輸入Unicode十六進位字碼值即可順利於Windows環境繕打。如日文「あ」Unicode十六進位值為3042,HTML中以「あ」表示為十進位,所以按「`」+「u」後輸入12354是不會得到日文「あ」字,另外必須注意,輸入數字時請利用鍵盤最上方數字,勿用右側數字鍵。
[编辑] 漢字問題
Unicode的漢字處理方法一直備受抨擊。有指這種把數萬漢字逐一編碼的方式,非常浪費資源,要把漢字加到Unicode標準中也不容易。也有批評處理Unicode中漢字編碼的專家,並不是真正研究漢字的學者。[1]從早期的中文電腦時期開始,已有研究以部件產生漢字(動態組字),取代漢字逐一編碼方法,其中以朱邦復的漢字基因工程成效最豐。
[编辑] Unicode 编码表
[编辑] 外部链接
- Unicode 5.0.0
- Unicode official site
- DecodeUnicode - Unicode WIKI, 50.000 gifs and information about each character
- Alan Wood's Unicode Resources
- The International Phonetic Alphabet in Unicode
- CJK Compatibility Ideographs
- Unicode character charts
- UTF-8 and Unicode FAQ
Unicode 相關的條目 |
---|
ISO 10646 通用字符集 | UTF-7 | UTF-8 | UTF-16 / UCS-2 | UTF-32 / UCS-4 |
Unicode编码表 | 基本多文種平面 | 辅助平面 | 中日韓統一表意文字 | CJKV | IICore |