Unicode编码
作者:林海枫
网址:http://blog.csdn.net/linyt/archive/2008/12/08/3477866.aspx
[注]:文章版权为作者所有,欢迎转载,但请完整转载并注明作者和完整地址,请勿用于任何商业用途。
什么是Unicode(统一码)?
不论是什么语言。
本文的Unicode编码就是指Unicode为每个字符分配一个唯一数字这一规则,但并不涉及这任何字符对应数字是如何储存的,它将会在Unicode编码形式方面表述。
1. Unicode简介与历史
Unicode(统 一码 、万国码和单 一码 )是目前为止包含字符文字最多的一种编码方案或字符集,它几乎为全球每种语言文字分配了唯一的字符编码。它由Unicode协会(http://www.unicode.org/)组织进行开发,编码和实现。到目前为止,最新的Unicode标准版本为Unicode5.1, 2008年4月发布。Unicode的出现,使得一直已久的编码问题得以解决,不同语言文字都有唯一的编码,字符间不会造成混乱,以满足跨语言、跨平台进行文转换、处理要求。
Unicode项目始建于1988年,由几个软件公司协作开发而成的单一字符集编码标准(single character set encoding standard),支持全球所有的文字。于1991年1月,Unicode项目形成一个新的组织为Unicode协会(Consortium),负责Unicode的开发,编码和实现和标准和方案,同年8月发布Unicode标准1.0。
无独有偶,一个名为ISO/IEC工作组于1984年成立,开始专注开发国际化字符集,支持全球所有语言的文字。该字符集命名为Universal Character Set(UCS), 并1989年发布UCS标准草案。
这两个组织都致力于构造一种通用的编码方案和实现,但它们的字符集都不能兼容,这样两个标准使人们混乱。ISO/IEC和Unicode协会意识到这一点,1991开始合并这两个标准。合并过程出现一些需要协商的问题,首先是ISO/IEC标准处于草案阶段而Unicode1.0标准已经发布了;还有就是Unicode被设计为统一的16位编码方案,最多可包含 65536个字符,而ISO/IEC标准使用31位编码方案,可包含多达20亿个字符。
2. Unicode编码
计算机历史上最早的编码方案应该是ASCII码,它采用整数[0,127]对字符进行编码。每个ASCII字符数值不超过127,因此采用一个字节就可以储存字符。由此编码空间(codespace)为0到127,ASCII字符集中包含了英文字母、数字、符号和控制字符。
定义:
Codespace(编码空间):给字符集所有字符分配的整数集。
Codepoint(代码):codespace中的任一个数值都称为codepoint
由于ASCII码只能表示全球文字的极少一部分,因此Unicode为了能容纳全球所有语言的文字,必须有一个更大的codespace。在早期Unicode 标准未和ISO/ICE标准合并提时,Unicode使用16位(2字节)整数的codespace。
Unicode编码字符集给每个字符分配了一个整数值,该整数值与Unicode字符集中的字符相对应,该整数有个特别称谓为Unicode scalar values(USVs);并且每个字符的USV和它对应的Codepoint是同一个数值,这里两个术语不进行区分,但后者最为常用。根据Unicode约定,Codepoint以“U+”开始,紧接着它对应的十六进制数表示,若不足四位则以0补齐。如“U+ 0345” , “U+ 10345” 和“U+ 20345” 等等。
在新的Unicode标准中,它的codespace从U+0000到U+10FFFF,空间大小为17*64K。在与ISO/IEC标准的合并过程出现的问题, Unicode提出了平面(Plane)的概念。Unicode把[U+0000, U+10FFFF]空间均等地划分成17块,每块称为一个平面,并以0作为开始编号进行命名。[U+0000, U+FFFF]所在的Plane称为Plane 0, [U+10000, U+1FFFF]所在的plane称为Plane 1, 依次类推。
早期的Unicode使用统一的16位编码,并且能够表示全球所有语言的文字,以及这些字符ISO/IEC字符集对应的字符进一致。早期16位编码字符刚好在Plane 0里面,故Unicode把Plane 0命名为Basic Multilingual Plane(BMP)。余下的Plane 1到Plane 16称为Supplementary Planes。新标准Unicode的很大部分codepoint需要用超过2个节字(这里仅指表示,而非存诸codepoint或它对它的字符),但全球所有语言文字都位于BMP中,它可以满足我们多语言的处理,因此全球语言文字使用2个字节就可以表示了。
到目前为止,并不是每个Codepoint分配给字符的,因此Codespace存在很多“真空”codepoint。具体如下:
1)每个Plane都有两个codepoint为非字符,它们是U+nFFFE和U+nFFFF(这里n表示从0到10的十六进制数)。
2)从U+D800到U+DFFFF共2048个codepoint为非字符。这些codepoint之所以不分配,是这些数值会由UTF-16 实现来使用,以免传输和储存过程出现冲突。
3)从标准TUS 3.1开始,Unicode保留32个字符U+FDD0..U+FDEF为非字符,便于程序用于特殊用途。
在17个plane中,一共包含1114112个codepoint。除去66个(2*17+32)为非字符, 2048个保留字符,Unicode space一共包含了1111988个可分配字符。
3. Unicode Planes结构与内容
Unicode字符集可以根据多种方式分类,但Unicode codespace逻辑上被划分成17个Plane, 每个Plane包含65536(2^16)个codepoint, 尽管如此,仍然只有少量的Plane被使用。当前Plane的划分和使用情况如下:
1)Plane 0(U+0000-U+FFFF)
命名为基本多文平面(Basic Multilingual Plane, BMP)。从目前来说,Unicode分配的所有字符中,大部分字符都位于MBP。它包含了早期Unicode(合并前)所分配的字符和全球当前所有语言使用的书写文字。
2)Plane 1(U+10000-U+1FFFF)
命名为辅助多文平面(Supplementary Multilingual Plane, SMP)。
3)Plane 2 (U+20000-U+2FFFF)
命名为表意文字补充平面(Supplementary Ideographic Plane, SIP)。
4)Planes 3 to 13(U+30000-U+DFFFF)
保留,未分配。
5)Plane 14 (U+E0000-U+EFFFF)
命名为特殊用途补充平面(Supplementray Special-purpose Plane, SSP)。
6) Plane 15 (U+F0000-U+FFFFF)
命名为私有使用区(Private Use Area, PUA)
7) Plane 16 (U+100000-U10FFFF)
命名为私有使用区(Private User Area, PUA),保留。
3.1 基本多文平面(BMP)
Unicode中第一个平面,通常称为基本多文平面(Basic Multilingual Plane, BMP), 它几乎包含了所有现代语言文字和大量特殊字符;此中很大部分分配给中文、日文和韩文文字(称为CJK)。在Unicode 5.1标准中,BMP所包含的字符如下:
· Basic Latin (0000– 007F )
· Latin-1 Supplement (0080–00FF)
· Latin Extended-A (0100– 017F )
· Latin Extended-B (0180– 024F )
· IPA Extensions (0250–02AF)
· Spacing Modifier Letters (02B0–02FF)
· Combining Diacritical Marks (0300– 036F )
· Greek and Coptic (0370–03FF)
· Cyrillic (0400–04FF)
· Cyrillic Supplement (0500– 052F )
· Armenian (0530– 058F )
· Hebrew (0590–05FF)
· Arabic (0600–06FF)
· Syriac (0700– 074F )
· Arabic Supplement (0750– 077F )
· Thaana (0780–07BF)
· N'Ko (Mandenkan) ( 07C 0–07FF)
· Indic scripts:
o Devanagari (0900– 097F )
o Bengali (0980–09FF)
o Gurmukhi ( 0A 00– 0A 7F )
o Gujarati ( 0A 80–0AFF)
o Oriya (0B00–0B 7F )
o Tamil (0B80–0BFF)
o Telugu ( 0C 00– 0C 7F )
o Kannada ( 0C 80–0CFF)
o Malayalam (0D00–0D 7F )
o Sinhala (0D80–0DFF)
· Thai (0E00–0E 7F )
· Lao (0E80–0EFF)
· Tibetan ( 0F 00–0FFF)
· Burmese ( Myanmar ) (1000– 109F )
· Georgian ( 10A 0–10FF)
· Hangul Jamo (1100–11FF)
· Ethiopic (1200– 137F )
· Ethiopic Supplement (1380– 139F )
· Cherokee ( 13A 0–13FF)
· Unified Canadian Aboriginal Syllabics (1400– 167F )
· Ogham (1680– 169F )
· Runic ( 16A 0–16FF)
· Philippine scripts:
o Tagalog (1700– 171F )
o Hanunóo (1720– 173F )
o Buhid (1740– 175F )
o Tagbanwa (1760– 177F )
· Khmer (1780–17FF)
· Mongolian (1800–18AF)
· Limbu (1900– 194F )
· Tai Le (1950– 197F )
· New Tai Lue (1980–19DF)
· Khmer Symbols (19E0–19FF)
· Buginese ( 1A 00– 1A 1F )
· Balinese (1B00–1B 7F )
· Lepcha (Rong) ( 1C 00– 1C 4F )
· Ol Chiki (Santali / Ol Cemet’) ( 1C 50– 1C 7F )
· Phonetic Extensions (1D00–1D 7F )
· Phonetic Extensions Supplement (1D80–1DBF)
· Combining Diacritical Marks Supplement (1DC0–1DFF)
· Latin Extended Additional (1E00–1EFF)
· Greek Extended ( 1F 00–1FFF)
· Symbols:
o General Punctuation (2000– 206F )
o Superscripts and Subscripts (2070– 209F )
o Currency Symbols ( 20A 0–20CF)
o Combining Diacritical Marks for Symbols (20D0–20FF)
o Letterlike Symbols (2100– 214F )
o Number Forms (2150– 218F )
o Arrows (2190–21FF)
o Mathematical Operators (2200–22FF)
o Miscellaneous Technical (2300–23FF)
o Control Pictures (2400– 243F )
o Optical Character Recognition (2440– 245F )
o Enclosed Alphanumerics (2460–24FF)
o Box Drawing (2500– 257F )
o Block Elements (2580– 259F )
o Geometric Shapes ( 25A 0–25FF)
o Miscellaneous Symbols (2600–26FF)
o Dingbats (2700–27BF)
o Miscellaneous Mathematical Symbols-A ( 27C 0–27EF)
o Supplemental Arrows-A ( 27F 0–27FF)
o Braille Patterns (2800–28FF)
o Supplemental Arrows-B (2900– 297F )
o Miscellaneous Mathematical Symbols-B (2980–29FF)
o Supplemental Mathematical Operators ( 2A 00–2AFF)
o Miscellaneous Symbols and Arrows (2B00–2BFF)
· Glagolitic ( 2C 00– 2C 5F )
· Latin Extended-C ( 2C 60– 2C 7F )
· Coptic ( 2C 80–2CFF)
· Georgian Supplement (2D00–2D 2F )
· Tifinagh (2D30–2D 7F )
· Ethiopic Extended (2D80–2DDF)
· Cyrillic Extended-A (2DE0–2DFF)
· Supplemental Punctuation (2E00–2E 7F )
· CJK Radicals Supplement (2E80–2EFF)
· Kangxi Radicals ( 2F 00–2FDF)
· Ideographic Description Characters (2FF0–2FFF)
· CJK Symbols and Punctuation (3000– 303F )
· Hiragana (3040– 309F )
· Katakana ( 30A 0–30FF)
· Bopomofo (3100– 312F )
· Hangul Compatibility Jamo (3130– 318F )
· Kanbun (3190– 319F )
· Bopomofo Extended ( 31A 0–31BF)
· CJK Strokes ( 31C 0–31EF)
· Katakana Phonetic Extensions ( 31F 0–31FF)
· Enclosed CJK Letters and Months (3200–32FF)
· CJK Compatibility (3300–33FF)
· CJK Unified Ideographs Extension A (3400–4DBF)
· Yijing Hexagram Symbols (4DC0–4DFF)
· CJK Unified Ideographs (4E00–9FFF)
· Yi Syllables (A000–A 48F )
· Yi Radicals (A490–A4CF)
· Vai (A500–A 63F )
· Cyrillic Extended-B (A640–A 69F )
· Modifier Tone Letters (A700–A 71F )
· Latin Extended-D (A720–A7FF)
· Syloti Nagri (A800–A 82F )
· Phags-pa (A840–A 87F )
· Saurashtra (A880–A8DF)
· Kayah Li (A900–A 92F )
· Rejang (A930–A 95F )
· Cham (AA00–AA 5F )
· Hangul Syllables (AC00–D7AF)
· High Surrogates (D800–DB 7F )
· High Private Use Surrogates (DB80–DBFF)
· Low Surrogates (DC00–DFFF)
· Private Use Area (E000–F8FF)
· CJK Compatibility Ideographs (F900–FAFF)
· Alphabetic Presentation Forms (FB00–FB 4F )
· Arabic Presentation Forms-A (FB50–FDFF)
· Variation Selectors (FE00–FE 0F )
· Vertical Forms (FE10–FE 1F )
· Combining Half Marks (FE20–FE 2F )
· CJK Compatibility Forms (FE30–FE 4F )
· Small Form Variants (FE50–FE 6F )
· Arabic Presentation Forms-B (FE70–FEFF)
· Halfwidth and Fullwidth Forms (FF00–FFEF)
· Specials (FFF0–FFFF)
3.2辅助多文平面(SMP)
Unicode中的第一平面,称为Supplementary Multilingual Plane(SMP)。它用于分配历史文字(如Linear B),同时用于分配数学和音乐符号。在Unicode 5.1标准中,SMP包括下面的文字:
· Linear B Syllabary (10000– 1007F )
· Linear B Ideograms (10080–100FF)
· Aegean Numbers (10100– 1013F )
· Ancient Greek Numbers (10140– 1018F )
· Ancient Symbols (10190–101CF)
· Phaistos Disc (101D0–101FF)
· Lycian (10280– 1029F )
· Carian ( 102A 0–102DF)
· Old Italic (10300– 1032F )
· Gothic (10330– 1034F )
· Ugaritic (10380– 1039F )
· Old Persian ( 103A 0–103DF)
· Deseret (10400– 1044F )
· Shavian (10450– 1047F )
· Osmanya (10480–104AF)
· Cypriot Syllabary (10800– 1083F )
· Phoenician (10900– 1091F )
· Lydian (10920– 1093F )
· Kharoshthi ( 10A 00– 10A 5F )
· Cuneiform (Sumero-Akkadian) (12000–123FF)
· Cuneiform Numbers and Punctuation (12400– 1247F )
· Byzantine Musical Symbols (1D000–1D0FF)
· Musical Symbols (1D100–1D1FF)
· Ancient Greek Musical Notation (1D200–1D 24F )
· Tai Xuan Jing Symbols (1D300–1D 35F )
· Counting Rod Numerals (1D360–1D 37F )
· Mathematical Alphanumeric Symbols (1D400–1D7FF)
· Mahjong Tiles ( 1F 000– 1F 02F )
· Domino Tiles ( 1F 030– 1F 09F )
3.3表意文字补充平面(SIP)
Unicode的第二平面,又称为表意文字补充平面(Supplementary Ideographic Plane, SIP)。它包含40000个统一汉字集(Unified Han Ideographs),为日常写作和通信中的生辟字。
CJK Unified Ideographs Extension B (20000– 2A 6DF)
CJK Compatibility Ideographs Supplement ( 2F 800–2FA 1F )
3.4保留平面
Unicode至今仍没有给Plane 3到Plane 13(共11个平面)分配字符,因此把它们称为保留平面(Unused Planes)。即使假设所有已知的书写系统文字都有待于Unicode进行编码,这些保留平面仍然不需要使用,可置身事外。然而,随着现代文明进程的发展,可能会发现更多、更新的语言文字。UCS和Unicode需要一步步把这些新的文字加入到Unicode,到时这些保留平面会派上用场。其实Unicode已经有所行动了,把Plane 3试验性地命名为第三表意文字平面(Tertiary Ideographic Plane, TIP),计划分配给古汉字(Old Hanzi)和骨甲文(Oracle Bone)。
3.5 特殊用途补充平面(SSP)
Plane 14(或十六进制E)命名为特殊用途补充平面(Supplementary Special-purpose Plane, SSP)。正如其名所述,SSP分配给特殊用途的字符。当前SSP包含两块大小分别是128和240的非图形字符。第一块分配给语言标记符,便于在其它协议中标记该语言的内容,以防止把该语言当成协议的一部分而造成歧义(如XML中的xml::lang属性)。另一块用于字型变换选取器(glyph variation selectors),表示字符的字形。
3.6 私有使用平面(PUA)
ISO和Uincode协会预留两个平面(Plane 15和16)给第三方组织、团体、公司企业甚到个人使用。Unicode标准不使用这两个平,任何第三方组织可以给这两个平面分配字符并使用。但使用这些平面将丢失和其它软件或平台的互操作,互交换等特性,因此支持Unicode标准的软件或字体都不必支持第三方在这两平面分配的字符集。
4. Unicode 映射表
映射表,顾名思义就是codpoint到字符的关系,上面分别介绍了Unicode里17个平面的用途,分配情况以及分配的字符。同时不同的平面有不情程度的真空codepoint,为了简明列出这些哪些codepoint没有分配,分配的codepoint对应什么字符,以及每个Plane中子区域的用途。下表可以简明说明这些情况。
BMP (U+0000 - U+FFFF)目前已全部分配,点下面的超链接可以查看各个子区域的字符集名称,以及它对应的字符。
SMP(U+10000 - U+1FFFF)目前只分配该平面的四分之一。
SIP(U+20000 - U+2FFFF)目前仍没有全部分配,只分配了四分之三。
SSP(U+E0000 – U+EFFFF),只分配了U+E0000 - U+E0FFF 中的一部分。
5. 相关资料
Unicode Home Page http://www.unicode.org/
Unicode协议是Unicode标准的开发和维护组织,该网站上可以查阅最新的Unicode标准,codepoint的分配情况,以及最新的Unicode字符表(codepoint chart)。
Unicode Code Charts http://www.unicode.org/charts/
Unicode最新标准支持的字符分配表(目前为5.1版)。
Unicode Codepoint Chart http://inamidst.com/stuff/unidata/
一个非官方的Unicode字符表,以 Codepoint大小为顺序展开。
Wiki-en
http://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes
http://en.wikipedia.org/wiki/Unicode
A Unicode tutorial http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a
比较详细和简单的Unicode入门教程。