UTF-16

维基百科,自由的百科全书
跳转到: 导航, 搜索
跳过字词转换说明

UTF-16Unicode的其中一個使用方式。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製作或儲存的文字使用大尾序格式,以MicrosoftLinux製作或儲存的文字使用小尾序格式。

為了弄清楚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編碼表
个人工具
名字空间
操作
导航
帮助
工具
其他语言