Unicode

Unicode

Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裡的一項業界標準,包括字元集、編碼方案等。Unicode 是為了解決傳統的字元編碼方案的局限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。

基本介紹

  • 中文名統一碼
  • 外文名:Unicode
  • 也稱:萬國碼
  • 解釋:計算機科學領域裡的一項業界標準
起源,作用,層次,方式,UTF-8,UTF-16,UTF-32,位元組序,分布,環境,字集,輸入,綜述,方法,其他,使用,簡史,編碼表,

起源

因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。最早的計算機在設計時採用8個比特(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255(二進制11111111=十進制255),0 - 255被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
如果要表示中文,顯然一個位元組是不夠的,至少需要兩個位元組,而且還不能和ASCII編碼衝突,所以,中國制定了GB2312編碼,用來把中文編進去。
類似的,日文和韓文等其他語言也有這個問題。為了統一所有文字的編碼,Unicode應運而生。Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。
Unicode通常用兩個位元組表示一個字元,原有的英文編碼從單位元組變成雙位元組,只需要把高位元組全部填為0就可以。
因為Python的誕生比Unicode標準發布的時間還要早,所以最早的Python只支持ASCII編碼,普通的字元串'ABC'在Python內部都是ASCII編碼的。
Unicode 是為了解決傳統的字元編碼方案的局限而產生的,例如ISO 8859所定義的字元雖然在不同的國家中廣泛地使用,可是在不同國家間卻經常出現不兼容的情況。很多傳統的編碼方式都有一個共同的問題,即容許電腦處理雙語環境(通常使用拉丁字母以及其本地語言),但卻無法同時支持多語言環境(指可同時處理多種語言混合的情況)。
Unicode 編碼包含了不同寫法的字,如“ɑ/a”、“戶/戶/戸”。然而在漢字方面引起了一字多形的認定爭議。
在文字處理方面,統一碼為每一個字元而非字形定義唯一的代碼(即一個整數)。換句話說,統一碼以一種抽象的方式(即數字)來處理字元,並將視覺上的演繹工作(例如字型大小、外觀形狀、字型形態、文體等)留給其他軟體來處理,例如網頁瀏覽器或是文字處理器。
幾乎所有電腦系統都支持基本拉丁字母,並各自支持不同的其他編碼方式。Unicode為了和它們相互兼容,其首256字元保留給ISO 8859-1所定義的字元,使既有的西歐語系文字的轉換不需特別考量;並且把大量相同的字元重複編到不同的字元碼中去,使得舊有紛雜的編碼方式得以和Unicode編碼間互相直接轉換,而不會丟失任何信息。舉例來說,全形格式區段包含了主要的拉丁字母的全形格式,在中文、日文、以及韓文字形當中,這些字元以全形的方式來呈現,而不以常見的半角形式顯示,這對豎排文字和等寬排列文字有重要作用。
在表示一個Unicode的字元時,通常會用“U+”然後緊接著一組十六進制的數字來表示這一個字元。在基本多文種平面(英文為 Basic Multilingual Plane,簡寫 BMP。它又簡稱為“零號平面”, plane 0)里的所有字元,要用四位十六進制數(例如U+4AE0,共支持六萬多個字元);在零號平面以外的字元則需要使用五位或六位十六進制數了。舊版的Unicode標準使用相近的標記方法,但卻有些微的差異:在Unicode 3.0里使用“U-”然後緊接著八位數,而“U+”則必須隨後緊接著四位數。

作用

能夠使計算機實現跨語言、跨平台的文本轉換及處理。

層次

Unicode 編碼系統,可分為編碼方式和實現方式兩個層次。

方式

Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。目前的Unicode字元分為17組編排,0x0000 至 0x10FFFF,每組稱為平面(Plane),而每平面擁有65536個碼位,共1114112個。然而目前只用了少數平面。UTF-8UTF-16UTF-32都是將數字轉換到程式數據的編碼方案。
通用字元集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字元集。UCS-2用兩個位元組編碼,UCS-4用4個位元組編碼。
歷史上存在兩個獨立的嘗試創立單一字元集的組織,即國際標準化組織(ISO)和多語言軟體製造商組成的統一碼聯盟。前者開發的 ISO/IEC 10646 項目,後者開發的統一碼項目。因此最初制定了不同的標準。
1991年前後,兩個項目的參與者都認識到,世界不需要兩個不兼容的字元集。於是,它們開始合併雙方的工作成果,並為創立一個單一編碼表而協同工作。從Unicode 2.0開始,Unicode採用了與ISO 10646-1相同的字型檔和字碼;ISO也承諾,ISO 10646將不會替超出U+10FFFF的UCS-4編碼賦值,以使得兩者保持一致。兩個項目仍都存在,並獨立地公布各自的標準。但統一碼聯盟和ISO/IEC JTC1/SC2都同意保持兩者標準的碼錶兼容,並緊密地共同調整任何未來的擴展。在發布的時候,Unicode一般都會採用有關字碼最常見的字型,但ISO 10646一般都儘可能採用Century字型。
UCS-4根據最高位為0的最高位元組分成27=128個group。每個group再根據次高位元組分為256個平面(plane)。每個平面根據第3個位元組分為256行 (row),每行有256個碼位(cell)。group 0的平面0被稱作BMP(Basic Multilingual Plane)。如果UCS-4的前兩個位元組為全零,那么將UCS-4的BMP去掉前面的兩個零位元組就得到了UCS-2。每個平面有216=65536個碼位。Unicode計畫使用了17個平面,一共有17×65536=1114112個碼位。在Unicode 5.0.0版本中,已定義的碼位只有238605個,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定義了兩個各占65534個碼位的專用區(Private Use Area),分別是0xF0000-0xFFFFD和0x100000-0x10FFFD。所謂專用區,就是保留給大家放自定義字元的區域,可以簡寫為PUA。
平面0也有一個專用區:0xE000-0xF8FF,有6400個碼位。平面0的0xD800-0xDFFF,共2048個碼位,是一個被稱作代理區(Surrogate)的特殊區域。代理區的目的用兩個UTF-16字元表示BMP以外的字元。在介紹UTF-16編碼時會介紹。
如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2048=99089。餘下的99089個已定義碼位分布在平面0、平面1、平面2和平面14上,它們對應著Unicode定義的99089個字元,其中包括71226個漢字。平面0、平面1、平面2和平面14上分別定義了52080、3419、43253和337個字元。平面2的43253個字元都是漢字。平面0上定義了27973個漢字。
在Unicode中:漢字“字”對應的數字是23383(十進制),十六進制表示為5B57。在Unicode中,我們有很多方式將數字23383表示成程式中的數據,包括:UTF-8UTF-16UTF-32。UTF是“Unicode Transformation Format”的縮寫,可以翻譯成Unicode字元集轉換格式,即怎樣將Unicode定義的數字轉換成程式數據。
例如,“漢字”對應的數字是0x6c49和0x5b57,而編碼的程式數據是:
char      data_utf8[]={0xE6,0xB1,0x89,0xE5,0xAD,0x97};//UTF-8編碼char16_t data_utf16[]={0x6C49,0x5B57};        //UTF-16編碼char32_t data_utf32[]={0x00006C49,0x00005B57};//UTF-32編碼
這裡用char、char16_t、char32_t分別表示無符號8位整數,無符號16位整數和無符號32位整數。UTF-8、UTF-16、UTF-32分別以char、char16_t、char32_t作為編碼單位。(註: char16_t 和 char32_t 是 C++ 11 標準新增的關鍵字。如果你的編譯器不支持 C++ 11 標準,請改用 unsigned short 和 unsigned long。)“漢字”的UTF-8編碼需要6個位元組。“漢字”的UTF-16編碼需要兩個char16_t,大小是4個位元組。“漢字”的UTF-32編碼需要兩個char32_t,大小是8個位元組。根據位元組序的不同,UTF-16可以被實現為UTF-16LE或UTF-16BE,UTF-32可以被實現為UTF-32LE或UTF-32BE。下面介紹UTF-8、UTF-16、UTF-32、位元組序和BOM。

UTF-8

UTF-8以位元組為單位對Unicode進行編碼。從Unicode到UTF-8的編碼方式如下:
Unicode編碼(十六進制) 
UTF-8 位元組流(二進制)
000000-00007F
0xxxxxxx
000080-0007FF
110xxxxx 10xxxxxx
000800-00FFFF
1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF
11110xxx10xxxxxx10xxxxxx10xxxxxx
UTF-8的特點是對不同範圍的字元使用不同長度的編碼。對於0x00-0x7F之間的字元,UTF-8編碼與ASCII編碼完全相同。UTF-8編碼的最大長度是4個位元組。從上表可以看出,4位元組模板有21個x,即可以容納21位二進制數字。Unicode的最大碼位0x10FFFF也只有21位。
例1:“漢”字的Unicode編碼是0x6C49。0x6C49在0x0800-0xFFFF之間,使用3位元組模板:1110xxxx 10xxxxxx 10xxxxxx。將0x6C49寫成二進制是:0110 1100 0100 1001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
例2:Unicode編碼0x20C30在0x010000-0x10FFFF之間,使用4位元組模板:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。將0x20C30寫成21位二進制數字(不足21位就在前面補0):0 0010 0000 1100 0011 0000,用這個比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

UTF-16

UTF-16編碼以16位無符號整數為單位。我們把Unicode編碼記作U。編碼規則如下:
unicodeunicode
如果U<0x10000,U的UTF-16編碼就是U對應的16位無符號整數(為書寫簡便,下文將16位無符號整數記作WORD)。
如果U≥0x10000,我們先計算U'=U-0x10000,然後將U'寫成二進制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16編碼(二進制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
為什麼U'可以被寫成20個二進制位?Unicode的最大碼位是0x10FFFF,減去0x10000後,U'的最大值是0xFFFFF,所以肯定可以用20個二進制位表示。例如:Unicode編碼0x20C30,減去0x10000後,得到0x10C30,寫成二進制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用後10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。
按照上述規則,Unicode編碼0x10000-0x10FFFF的UTF-16編碼有兩個WORD,第一個WORD的高6位是110110,第二個WORD的高6位是110111。可見,第一個WORD的取值範圍(二進制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二個WORD的取值範圍(二進制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。
為了將一個WORD的UTF-16編碼與兩個WORD的UTF-16編碼區分開來,Unicode編碼的設計者將0xD800-0xDFFF保留下來,並稱為代理區(Surrogate):
D800-DB7F
High Surrogates
高位替代
DB80-DBFF
High Private Use Surrogates
高位專用替代
DC00-DFFF
Low Surrogates
低位替代
高位替代就是指這個範圍的碼位是兩個WORD的UTF-16編碼的第一個WORD。低位替代就是指這個範圍的碼位是兩個WORD的UTF-16編碼的第二個WORD。那么,高位專用替代是什麼意思?我們來解答這個問題,順便看看怎么由UTF-16編碼推導Unicode編碼。
如果一個字元的UTF-16編碼的第一個WORD在0xDB80到0xDBFF之間,那么它的Unicode編碼在什麼範圍內?我們知道第二個WORD的取值範圍是0xDC00-0xDFFF,所以這個字元的UTF-16編碼範圍應該是0xDB80 0xDC00到0xDBFF 0xDFFF。我們將這個範圍寫成二進制:
1101101110000000 11011100 00000000 - 1101101111111111 1101111111111111
按照編碼的相反步驟,取出高低WORD的後10位,並拼在一起,得到
1110 0000 0000 0000 0000 - 1111 1111 1111 1111 1111即0xe0000-0xfffff,按照編碼的相反步驟再加上0x10000,得到0xf0000-0x10ffff。這就是UTF-16編碼的第一個WORD在0xdb80到0xdbff之間的Unicode編碼範圍,即平面15和平面16。因為Unicode標準將平面15和平面16都作為專用區,所以0xDB80到0xDBFF之間的保留碼位被稱作高位專用替代。
XMLXML

UTF-32

UTF-32編碼以32位無符號整數為單位。Unicode的UTF-32編碼就是其對應的32位無符號整數。

位元組序

位元組序有兩種,分別是“大端”(Big Endian, BE)和“小端”(Little Endian, LE)。
根據位元組序的不同,UTF-16可被實現為UTF-16LE或UTF-16BE,UTF-32可被實現為UTF-32LE或UTF-32BE。例如:
Unicode編碼
UTF-16LE 
UTF-16BE 
UTF32-LE 
UTF32-BE
0x006C49
49 6C
6C 49
49 6C 00 00
00 00 6C 49
0x020C30
43 D8 30 DC
D8 43 DC 30
30 0C 02 00
00 02 0C 30
Unicode標準建議用BOM(Byte Order Mark)來區分位元組序,即在傳輸位元組流前,先傳輸被作為BOM的字元“零寬無中斷空格”。這個字元的編碼是FEFF,而反過來的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定義的碼位,不應該出現在實際傳輸中。
下表是各種UTF編碼的BOM:
UTF編碼
Byte Order Mark (BOM)
UTF-8 without BOM
UTF-8 with BOM
EF BB BF
UTF-16LE
FF FE
UTF-16BE
FE FF
UTF-32LE
FF FE 00 00
UTF-32BE
00 00 FE FF

分布

Unicode 到目前為止所定義的十七個平面中,第0平面(BMP)最為重要,其編碼分布如下:
註:中文範圍 4E00-9FA5:CJK 統一表意符號 (CJK Unified Ideographs)
0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin)
0080-00FF:C1控制符及拉丁文補充-1 (C1 Control and Latin 1 Supplement)
0100-017F:拉丁文擴展-A (Latin Extended-A)
0180-024F:拉丁文擴展-B (Latin Extended-B)
0250-02AF:國際音標擴展 (IPA Extensions)
02B0-02FF:空白修飾字母 (Spacing Modifiers)
0300-036F:結合用讀音符號 (Combining Diacritics Marks)
0370-03FF:希臘文及科普特文 (Greek and Coptic)
Microsoft WordMicrosoft Word
0400-04FF:西里爾字母(Cyrillic)
0500-052F:西里爾字母補充 (Cyrillic Supplement)
0530-058F:亞美尼亞語 (Armenian)
0590-05FF:希伯來文 (Hebrew)
0600-06FF:阿拉伯文 (Arabic)
0700-074F:敘利亞文 (Syriac)
0750-077F:阿拉伯文補充 (Arabic Supplement)
0780-07BF:馬爾地夫語 (Thaana)
07C0-07FF:西非書面語言 (N'Ko)
0800-085F:阿維斯塔語及巴列維語(Avestan and Pahlavi)
0860-087F:Mandaic
0880-08AF:撒馬利亞語 (Samaritan)
0900-097F:天城文書 (Devanagari)
0980-09FF:孟加拉語 (Bengali)
0A00-0A7F:錫克教文 (Gurmukhi)
0A80-0AFF:古吉拉特文 (Gujarati)
0B00-0B7F:奧里亞文 (Oriya)
0B80-0BFF:泰米爾文 (Tamil)
0C00-0C7F:泰盧固文 (Telugu)
0C80-0CFF:卡納達文 (Kannada)
0D00-0D7F:德拉維族語 (Malayalam)
0D80-0DFF:僧伽羅語 (Sinhala)
0E00-0E7F:泰文 (Thai)
0E80-0EFF:寮國文 (Lao)
0F00-0FFF:藏文 (Tibetan)
1000-109F:緬甸語 (Myanmar)
10A0-10FF:喬治亞語(Georgian)
1100-11FF:朝鮮文 (Hangul Jamo)
1200-137F:衣索比亞語 (Ethiopic)
1380-139F:衣索比亞語補充 (Ethiopic Supplement)
13A0-13FF:切羅基語 (Cherokee)
1400-167F:統一加拿大土著語音節 (Unified Canadian Aboriginal Syllabics)
1680-169F:歐甘字母 (Ogham)
16A0-16FF:如尼文(Runic)
1700-171F:塔加拉語 (Tagalog)
1720-173F:Hanunóo
1740-175F:Buhid
1760-177F:塔格班瓦文(Tagbanwa)
1780-17FF:高棉語 (Khmer)
1800-18AF:蒙古文 (Mongolian)
18B0-18FF:Cham
1900-194F:Limbu
1950-197F:德宏泰語 (Tai Le)
1980-19DF:新傣仂語 (New Tai Lue)
19E0-19FF:高棉語記號 (Kmer Symbols)
1A00-1A1F:Buginese
1A20-1A5F:Batak
1A80-1AEF:Lanna
1B00-1B7F:巴厘語 (Balinese)
1B80-1BB0:巽他語 (Sundanese)
1BC0-1BFF:Pahawh Hmong
1C00-1C4F:雷布查語(Lepcha)
1C50-1C7F:桑塔利文(Ol Chiki)
1C80-1CDF:曼尼普爾語(Meithei/Manipuri)
1D00-1D7F:語音學擴展 (Phonetic Extensions)
1D80-1DBF:語音學擴展補充 (Phonetic Extensions Supplement)
unicodeunicode
1DC0-1DFF:結合用讀音符號補充 (Combining Diacritics Marks Supplement)
1E00-1EFF:拉丁文擴充附加 (Latin Extended Additional)
1F00-1FFF:希臘語擴充 (Greek Extended)
2000-206F:常用標點(General Punctuation)
2070-209F:上標及下標 (Superscripts and Subscripts)
20A0-20CF:貨幣符號 (Currency Symbols)
20D0-20FF:組合用記號 (Combining Diacritics Marks for Symbols)
2100-214F:字母式符號 (Letterlike Symbols)
2150-218F:數字形式 (Number Form)
2190-21FF:箭頭 (Arrows)
2200-22FF:數學運算符 (Mathematical Operator)
2300-23FF:雜項工業符號 (Miscellaneous Technical)
2400-243F:控制圖片 (Control Pictures)
2440-245F:光學識別符 (Optical Character Recognition)
2460-24FF:封閉式字母數字 (Enclosed Alphanumerics)
2500-257F:制表符 (Box Drawing)
2580-259F:方塊元素 (Block Element)
25A0-25FF:幾何圖形 (Geometric Shapes)
2600-26FF:雜項符號 (Miscellaneous Symbols)
2700-27BF:印刷符號 (Dingbats)
27C0-27EF:雜項數學符號-A (Miscellaneous Mathematical Symbols-A)
27F0-27FF:追加箭頭-A (Supplemental Arrows-A)
2800-28FF:盲文點字模型 (Braille Patterns)
2900-297F:追加箭頭-B (Supplemental Arrows-B)
2980-29FF:雜項數學符號-B (Miscellaneous Mathematical Symbols-B)
2A00-2AFF:追加數學運算符 (Supplemental Mathematical Operator)
2B00-2BFF:雜項符號和箭頭 (Miscellaneous Symbols and Arrows)
2C00-2C5F:格拉哥里字母(Glagolitic)
2C60-2C7F:拉丁文擴展-C (Latin Extended-C)
2C80-2CFF:古埃及語 (Coptic)
2D00-2D2F:喬治亞語補充 (Georgian Supplement)
2D30-2D7F:提非納文 (Tifinagh)
2D80-2DDF:衣索比亞語擴展 (Ethiopic Extended)
2E00-2E7F:追加標點 (Supplemental Punctuation)
2E80-2EFF:CJK 部首補充 (CJK Radicals Supplement)
2F00-2FDF:康熙字典部首 (Kangxi Radicals)
2FF0-2FFF:表意文字描述符 (Ideographic Description Characters)
3000-303F:CJK 符號和標點 (CJK Symbols and Punctuation)
3040-309F:日文平假名 (Hiragana)
30A0-30FF:日文片假名 (Katakana)
3100-312F:注音字母 (Bopomofo)
3130-318F:朝鮮文兼容字母 (Hangul Compatibility Jamo)
3190-319F:象形字注釋標誌 (Kanbun)
31A0-31BF:注音字母擴展 (Bopomofo Extended)
31C0-31EF:CJK 筆畫 (CJK Strokes)
31F0-31FF:日文片假名語音擴展 (Katakana Phonetic Extensions)
3200-32FF:封閉式 CJK 文字和月份 (Enclosed CJK Letters and Months)
3300-33FF:CJK 兼容 (CJK Compatibility)
3400-4DBF:CJK 統一表意符號擴展 A (CJK Unified Ideographs Extension A)
4DC0-4DFF:易經六十四卦符號 (Yijing Hexagrams Symbols)
4E00-9FBF:CJK 統一表意符號 (CJK Unified Ideographs)
A000-A48F:彝文音節 (Yi Syllables)
A490-A4CF:彝文字根 (Yi Radicals)
A500-A61F:Vai
A660-A6FF:統一加拿大土著語音節補充 (Unified Canadian Aboriginal Syllabics Supplement)
A700-A71F:聲調修飾字母 (Modifier Tone Letters)
A720-A7FF:拉丁文擴展-D (Latin Extended-D)
A800-A82F:Syloti Nagri
A840-A87F:八思巴字 (Phags-pa)
A880-A8DF:Saurashtra
A900-A97F:爪哇語 (Javanese)
A980-A9DF:Chakma
AA00-AA3F:Varang Kshiti
AA40-AA6F:Sorang Sompeng
AA80-AADF:Newari
AB00-AB5F:越南傣語 (Vi?t Thái)
AB80-ABA0:Kayah Li
AC00-D7AF:朝鮮文音節 (Hangul Syllables)
D800-DBFF:High-half zone of UTF-16
DC00-DFFF:Low-half zone of UTF-16
E000-F8FF:自行使用區域 (Private Use Zone)
F900-FAFF:CJK 兼容象形文字 (CJK Compatibility Ideographs)
FB00-FB4F:字母表達形式 (Alphabetic Presentation Form)
FB50-FDFF:阿拉伯表達形式A (Arabic Presentation Form-A)
FE00-FE0F:變數選擇符 (Variation Selector)
FE10-FE1F:豎排形式 (Vertical Forms)
FE20-FE2F:組合用半符號 (Combining Half Marks)
FE30-FE4F:CJK 兼容形式 (CJK Compatibility Forms)
FE50-FE6F:小型變體形式 (Small Form Variants)
FE70-FEFF:阿拉伯表達形式B (Arabic Presentation Form-B)
FF00-FFEF:半型及全型形式 (Halfwidth and Fullwidth Form)
FFF0-FFFF:特殊 (Specials)

環境

在非 Unicode 環境下,由於不同國家和地區採用的字元集不一致,很可能出現無法正常顯示所有字元的情況。微軟公司使用了代碼頁(Codepage)轉換表的技術來過渡性的部分解決這一問題,即通過指定的轉換表將非 Unicode 的字元編碼轉換為同一字元對應的系統內部使用的 Unicode 編碼。可以在“語言與區域設定”中選擇一個代碼頁作為非 Unicode 編碼所採用的默認編碼方式,如936為簡體中文GBK,950為繁體中文Big5(皆指PC上使用的)。在這種情況下,一些非英語的歐洲語言編寫的軟體和文檔很可能出現亂碼。而將代碼頁設定為相應語言中文處理又會出現問題,這一情況無法避免。從根本上說,完全採用統一編碼才是解決之道,但是Windows作業系統由於歷史遺留原因尚無法做到這一點。
代碼頁技術廣泛為各種平台所採用。UTF-7 的代碼頁是65000,UTF-8 的代碼頁是65001。

字集

XML及其子集HTML採用UTF-8作為標準字集,理論上我們可以在各種支持XML標準的瀏覽器上顯示任何地區文字的網頁,只要電腦本身安裝有合適的字型即可。可以利用&#nnn;的格式顯示特定的字元。nnn代表該字元的十進制 Unicode 代碼。如果採用十六進制代碼,在編碼之前加上x字元即可。但部分舊版本的瀏覽器可能無法識別十六進制代碼。
然而部分由於Unicode 版本發展原因,很多瀏覽器只能顯示UCS-2 完整字元集也即日常使用的Unicode 版本中的一個小子集。下表可以檢驗您的瀏覽器怎樣顯示各種各樣的 Unicode 代碼:
Unicode

輸入

綜述

除了輸入法外,作業系統會提供幾種方法輸入Unicode。像是Windows 2000之後的Windows系統就提供一個可點擊的表。例如在Microsoft Word或者金山WPS之下,按下Alt鍵不放,輸入 0 和某個字元的 Unicode 編碼(十進制),再鬆開 Alt 鍵即可得到該字元,如Alt + 033865會得到Unicode字元“葉”(繁體)。另外按Alt + X 組合鍵,MS Word 也會將游標前面的字元同其十六進制的四位 Unicode 編碼進行互相轉換。
Unicode 編碼表反彈
0000-0FFF 8000-8FFF 10000-10FFF 20000-20FFF 28000-28FFF
1000-1FFF 9000-9FFF 21000-21FFF 29000-29FFF
2000-2FFF A000-AFFF 22000-22FFF 2A000-2AFFF
3000-3FFF B000-BFFF 23000-23FFF
4000-4FFF C000-CFFF 1D000-1DFFF 24000-24FFF 2F000-2FFFF
5000-5FFF D000-DFFF 25000-25FFF
6000-6FFF E000-EFFF 26000-26FFF
7000-7FFF F000-FFFF 27000-27FFF E0000-E0FFF
Unicode 已經有6.2版本。世界上有一大批計算機、語言學等科學家專門研究Unicode,Unicode標準已經不單是一個編碼標準,還是記錄人類語言文字資料的一個巨大的資料庫,同時從事人類文化遺產的發掘和保護工作。
對於中文而言,Unicode 16編碼裡面已經包含了GB18030裡面的所有漢字(27484個字),Unicode標準準備把康熙字典的所有漢字放入到Unicode 32bit編碼中。
簡單地說,Unicode擴展自ASCII字元集。在嚴格的ASCII中,每個字元用7位元表示,或者電腦上普遍使用的每字元有8位元寬;而Unicode使用全16位元字元集。這使得Unicode能夠表示世界上所有的書寫語言中可能用於電腦通訊的字元、象形文字和其他符號。Unicode最初打算作為ASCII的補充,可能的話,最終將代替它。考慮到ASCII是電腦中最具支配地位的標準,所以這的確是一個很高的目標。
Unicode影響到了電腦工業的每個部分,但也許會對作業系統和程式設計語言的影響最大。從這方面來看,我們已經上路了。Windows NT從底層支持Unicode(不幸的是,Windows 98隻是小部分支援Unicode)。先天即被ANSI束縛的C程式設計語言通過對寬字元集的支持來支持Unicode。

方法

中文輸入法截至2009年3月,可以使用微軟拼音2003或2007版本海峰五筆9.3版本,新注音輸入法 和 VimIM 進行輸入。
微軟拼音 在輸入法啟動狀態下,單擊語言欄上的“功能選單”按鈕,指向“輔助輸入法”即可發現“Unicode碼輸入方式”,利用它可以直接輸入Unicode相應十六進制值的方式輸入相應文字。例如中文“胥”輸入“5066”,朝鮮語文字“셅”輸入“c145”(不需要在前面加0x或x)。海峰五筆 此輸入法已經直接支持透過五筆碼輸入方式輸入Unicode內的任意中日韓漢字,但無法使用鍵入Unicode碼的方式輸入。例如漢字(Unicode部分)“㗎”為“keks”,CJK擴展B區的“㿱”為“iyho”和CJK擴展C區的“뇛”為“muih”。新注音輸入法 在輸入法啟動狀態時,打入鍵盤上的“多功能前導字元鍵”(及通用鍵盤上之“`”),第一次使用會彈出說明。輸入Unicode字元“胥”則是在鍵盤上鍵入“`U5066”。而韓語中的“셅”,則輸入“`UC145”。而要輸入日語自製漢字“卡”,則是“`U5CE0”。VimIM 在 Vim 環境中,可以直接鍵入十進制或十六進制 Unicode 碼。既不需要啟動輸入法,也不需要碼錶。
日文輸入法使用Microsoft IME 2007,可以在IME PAD里找到UNICODE的點擊表。點擊字元即可輸入。選擇字型可以預覽字元效果。

其他

除了輸入法外,作業系統也會提供另外幾種方法輸入 Unicode。像是Windows 2000之後的 Windows 系統就提供一個可點擊的字元映射表。又或者在Microsoft Word下,按下 Alt 鍵不放,輸入 0 和某個字元的 Unicode 編碼(十進制),再鬆開 Alt 鍵即可得到該字元,如Alt + 033865會得到 Unicode 字元。另外按Alt + X 組合鍵,MS Word 也會將游標前面的字元,同其十六進制的四位Unicode 編碼進行互相轉換。
新建文本也能輸入、右鍵

使用

基本上,計算機只是處理數字。它們指定一個數字,來儲存字母或其他字元。在創造Unicode之前,有數百種指定這些數字的編碼系統。沒有一個編碼可以包含足夠的字元:例如,單單歐洲共同體就需要好幾種不同的編碼來包括所有的語言。即使是單一種語言,例如英語,也沒有哪一個編碼可以適用於所有的字母,標點符號,和常用的技術符號。這些編碼系統也會互相衝突。也就是說,兩種編碼可能使用相同的數字代表兩個不同的字元,或使用不同的數字代表相同的字元。任何一台特定的計算機(特別是伺服器)都需要支持許多不同的編碼,但是,不論什麼時候數據通過不同的編碼或平台之間,那些數據總會有損壞的危險。
為什麼使用Unicode其實原因很簡單,因為Unicode比ANSI好用。 自從Windows2K開始,Win的系統核心開始完全支持並完全套用Unicode編寫,所有ANSI字元在進入底層前,都會被相應的API轉換成Unicode。所以,如果你一開始就使用Unicode,則可以減少轉換的用時和RAM開銷。 對於JAVA/.NET等這些“新”的語言來說,內置的字元串所使用的字元集已經完全是Unicode。最重要的是,世界上大多數程式用的字元集都是Unicode,因為Unicode有利於程式國際化和標準化。

簡史

1990年開始研發,1994年正式公布。隨著計算機工作能力的增強,Unicode也在面世以來的十多年裡得到普及。
Unicode6.3版已發布(2013年11月)。在Unicode聯盟網站上可以查看完整的6.3的核心規範。
Unicode定義了大到足以代表人類所有可讀字元的字元集。
Java語言就用到了Unicode編碼,從而實現了該語言的國際通用性。
Unicode截至目前為止,共發布了以下多個版本:
Unicode 1.0:1991年10月
Unicode 1.0.1:1992年6月
Unicode 1.1:1993年6月
Unicode 2.0:1997年7月
Unicode 2.1:1998年5月
Unicode 2.1.2:1998年5月
Unicode 3.0:1999年9月;涵蓋了來自ISO 10646-1的十六比特通用字元集(UCS)基本多文種平面(Basic Multilingual Plane)
Unicode 3.1:2001年3月;新增從ISO 10646-2定義的輔助平面(Supplementary Planes)
Unicode 3.2:2002年3月
Unicode 4.0:2003年4月
Unicode 4.0.1:2004年3月
Unicode 4.1:2005年3月
Unicode 5.0:2006年7月
Unicode 5.1:2008年4月
Unicode 5.2:2009年10月
Unicode 6.0:2010年10月
Unicode 6.1:2012年1月31日
Unicode 6.2:2012年9月
Unicode 6.3:2013年11月19日
Unicode 7.0:2014年6月15日
Unicode 8.0:2015年6月17日
Unicode 9.0:2016年6月22日
Unicode 10.0:2017年6月18日
Unicode 11.0:2018年6月5日

編碼表

U+
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
4e00
4e10
4e20
4e30
丿
4e40
4e50
4e60
4e70
乿
4e80
4e90
4ea0
4eb0
4ec0
4ed0
4ee0
4ef0
仿
4f00
4f10
4f20
倀
4f30
伿
4f40
4f50
4f60
4f70
使
4f80
4f90
4fa0
4fb0
便
4fc0
4fd0
4fe0
4ff0
俿
5000
倀
5010
5020
仿
5030
5040
5050
5060
5070
5080
5090
50a0
50b0
50c0
50d0
50e0
50f0
5100
5110
5120
5130
5140
5150
5160
5170
5180
5190
51a0
51b0
51c0
51D0
51E0
51F0
5200
5210
5220
5230
5240
5250
5260
5270
5280
5290
52A0
52B0
52C0
52D0
52E0
52F0
5300
5310
5320
5330
5340
5350
5360
5370
5380
5390
53a0
53b0
53c0
53d0
53e0
53f0
5400
5410
5420
5430
5440
5450
5460
5470
5480
5490
54a0
54b0
54c0
54d0
54e0
54f0
5500
5510
5520
5530
5540
5550
5560
5570
5580
5590
55a0
55b0
55c0
55d0
55e0
55f0
5600
5610
5620
5630
5640
5650
5660
5670
5680
5690
56a0
56b0
56c0
56d0
56e0
56f0
5700
5710
5720
5730
5740
5750
5760
5770
5780
5790
57a0
57b0
57c0
57d0
57e0
57f0
5800
5810
5820
5830
5840
5850
5860
5870
5880
5890
58a0
58b0
58c0
58d0
58e0
58f0
5900
5910
5920
5930
夿
5940
5950
5960
5970
奿
5980
5990
59a0
59b0
妿
59c0
59d0
59e0
59f0
姿
5a00
5a10
5a20
5a30
娿
5a40
5a50
5a60
5a70
嫿
婿
5a80
5a90
5aa0
5ab0
媿
5ac0
5ad0
5ae0
5af0
嫿
5b00
5b10
5b20
5b30
嬿
5b40
5b50
5b60
孿
5b70
孿
5b80
5b90
5ba0
5bb0
宿
5bc0
5bd0
5be0
5bf0
5c00
5c10
5c20
5c30
尿
5c40
5c50
5c60
5c70
5c80
5c90
5ca0
5cb0
5cc0
5cd0
5ce0
5cf0
峿
5d00
5d10
5d20
5d30
崿
5d40
5d50
5d60
5d70
嵿
5d80
5d90
5da0
5db0
嶿
5dc0
5dd0
5de0
5df0
巿
5e00
5e10
5e20
5e30
帿
5e40
5e50
5e60
5e70
5e80
5e90
5ea0
5eb0
庿
5ec0
5ed0
5ee0
5ef0
廿
5f00
5f10
5f20
5f30
弿
5f40
5f50
5f60
5f70
5f80
5f90
5fa0
5fb0
徿
5fc0
5fd0
5fe0
5ff0
忿
6000
6010
6020
6030
6040
6050
6060
6070
6080
6090
60a0
60b0
60c0
60d0
60e0
60f0
6100
6110
6120
6130
6140
6150
6160
6170
6180
6190
61a0
61b0
61c0
61d0
61e0
61f0
6200
6210
6220
6230
6240
6250
6260
6270
6280
6290
62a0
62b0
62c0
62d0
62e0
62f0
6300
6310
6320
6330
6340
6350
6360
6370
6380
6390
63a0
63b0
63c0
63d0
63e0
63f0
6400
6410
6420
6430
6440
6450
6460
6470
6480
6490
64a0
64b0
64c0
64d0
64e0
64f0
6500
6510
6520
6530
6540
6550
6560
6570
6580
6590
65a0
65b0

相關詞條

熱門詞條

聯絡我們