UTF-16
UTF-16是Unicode的其中一個使用方式。UTF是Unicode/UCS Transformation Format,即把Unicode轉做某種格式的意思。
它定義於ISO/IEC 10646-1的附錄Q,而RFC2781也定義了相似的做法。
在基本多語言平面內定義的符號((Basic Multilingual Plane, BMP),或稱第零平面(Plane 0)),使用2個字節表示,在此之外的字符(其他平面內的字符),則使用4個字節表示。由於第零平面內,從0XD800到0XDFFF之間的區段是沒有使用的,因此可以利用0XD800-0XDFFF之間的值來對輔助平面的字符進行編碼。
其編碼方法是:
1如果字符編碼U小於0x10000,也就是十進制的0到65535之內,則直接使用兩字節表示;
2如果字符編碼U大於0x10000,由於UNICODE編碼範圍最大為0x10FFFF,從0x10000到0x10FFFF之間 共有0xFFFFF個編碼,也就是需要20個bit就可以標示這些編碼。用U'表示從0-0xFFFFF之間的值,將其前 10 bit作為高位和16 bit的數值0xD800進行 邏輯or 操作,將後10 bit作為低位和0xDC00做 邏輯or 操作,這樣組成的 4個byte就構成了U的編碼。
目录 |
[编辑] 範例: UTF-16 編碼程序
假設要將 U+64321 (16進位) 轉成 UTF-16 編碼. 因為它超過 U+FFFF, 所以他必須編譯成32位元(4個byte)的格式,如下所示:11
V = 0x64321 Vx = V - 0x10000 = 0x54321 = 0101 0100 0011 0010 0001 Vh = 01 0101 0000 // Vx 的高位部份的 10 bits Vl = 11 0010 0001 // Vx 的低位部份的 10 bits w1 = 0xD800 //結果的前16位元初始值 w2 = 0xDC00 //結果的後16位元初始值 w1 = w1 | Vh = 1101 1000 0000 0000 | 01 0101 0000 = 1101 1001 0101 0000 = 0xD950 w2 = w2 | Vl = 1101 1100 0000 0000 | 11 0010 0001 = 1101 1111 0010 0001 = 0xDF21
所以這個字 U+64321 最後正確的 UTF-16 編碼應該是:
0xD950 0xDF21
而在小尾序中最后的编码应该是:
0x50D9 0x21DF
因為這個字超過 U+FFFF 所以無法用 UCS-2 的格式編碼
| 16進制編碼範圍 | UTF-16表示方法(二進制) | 10進制碼範圍 | 字節數量 |
|---|---|---|---|
| U+0000---U+FFFF | xxxxxxxx xxxxxxxx | 0-65535 | 2 |
| U+10000---U+10FFFF | 110110yyyyyyyyyy 110111xxxxxxxxxx | 65536-1114111 | 4 |
UTF-16比起UTF-8,好處在於大部分字符都以固定長度的字節(2字節)儲存,但UTF-16卻無法相容於ASCII編碼。
[编辑] UTF-16的編碼模式
UTF-16的大尾序和小尾序儲存形式都在用。一般來說,以Macintosh製作或儲存的文字使用大尾序格式,以Microsoft或Linux製作或儲存的文字使用小尾序格式。
為了弄清楚UTF-16文件的大小尾序,在UTF-16文件的開首,都會放置一個U+FEFF字符作為Byte Order Mark(UTF-16LE以FF FE代表,UTF-16BE以FE FF代表),以顯示這個文字檔案是以UTF-16編碼,其中U+FEFF字符在UNICODE中代表的意義是ZERO WIDTH NO-BREAK SPACE,顧名思義,它是個沒有寬度也沒有斷字的空白。
以下的例子有四個字符:「朱」(U+6731)、半角逗號 (U+002C)、「聿」(U+807F)、「𪚥」(U+2A6A5)。
| 使用UTF-16編碼的例子 | ||||||
|---|---|---|---|---|---|---|
| 編碼名稱 | 編碼次序 | 編碼 | ||||
| BOM | 朱 | , | 聿 | 𪚥 | ||
| UTF-16LE | 小尾序 | 31 67 | 2C 00 | 7F 80 | 69 D8 A5 DE | |
| UTF-16BE | 大尾序 | 67 31 | 00 2C | 80 7F | D8 69 DE A5 | |
| UTF-16 | 小尾序,包含BOM | FF FE | 31 67 | 2C 00 | 7F 80 | 69 D8 A5 DE |
| UTF-16 | 大尾序,包含BOM | FE FF | 67 31 | 00 2C | 80 7F | D8 69 DE A5 |
[编辑] UTF-16與UCS-2的關係
UTF-16可看成是UCS-2的父集。在沒有輔助平面字符Mapping of Unicode character planes(surrogate code points)前,UTF-16與UCS-2所指的是同一的意思。但當引入輔助平面字符後,就稱為UTF-16了。現在若有軟件聲稱自己支援UCS-2編碼,那其實是暗指它不能支援在UTF-16中超過2bytes的字集。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼。
[编辑] 外部連結
| Unicode 相關的條目 |
|---|
| Unicode字符列表 | Unicode聯盟 | Unicode技術委員會 | ISO 10646(通用字符集) | UTF-7 | UTF-8 | UTF-16 / UCS-2 | UTF-32 / UCS-4 |
| Unicode字符平面映射 | 中日韓統一表意文字 | CJKV | 表意文字小組(IRG) | IICore | 完整Unicode編碼表 |