UTF-16是Unicode的其中一個使用方式。 UTF是 Unicode/UCS Transformation Format,即把Unicode轉做某種格式的意思。但是萬萬不要說UTF-16編碼就是Unicode,這是不對的,因為Unicode他是由2個byte組成的,但是大多數UTF-16也是2個byte組成的,也有4個byte組成的,如:中國文字大部份是兩位元組,有的是四位元組(很多人可能沒見過,方正楷體S-超大字元集(SIP)這個字體裏面存放的都是四位元組的字模,可以從http://wyx.nbtvu.net.cn/jmm/Computing/indexComputing.htm下載相關字體)。
二 UTF-16編碼
1.Unicode值小於0x10000的用等於該值的16位元整數來表示。
2.Unicode值介於0x10000和0x10FFFF之間的,用一個值介於0xD800和0xDBFF(在所謂的高8位區)的16位元整數和值介於0xDC00和0xDFFF(在所謂的低8位區)的16位元整數來表示。
3.Unicode值大於0x10FFFF不能按照UTF-16進行編碼。
注意:在0xD800和0xDFFF間的值是特別為UTF-16預留,所以不應該將任何字元的值指定為這個區間內的數值.UTF-16比起UTF-8,好處在於大部分字元都以固定長度的位元組(2位元組)儲存,但UTF-16卻無法相容於ASCII編碼。
三 Unicode轉UTF-16
將某個字元的Unicode值轉換為UTF-16的編碼按照以下步驟進行。假設U是給Unicode值,小於x10FFFF。
1) 如果U < 0x10000,U的編碼就是無符號的十六位元整數,值和其本身的值一樣,處理結束。 2) 如果U等於或者小於0x10FFFF,則設U' = U - 0x10000。此時,U'一定小於或者等於0xFFFFF,也就是說,U'的值不會超過20位。 3) 分別初始化2個16位元無符號的整數,W1和W2為0xD800和0xDC00。每個整數都有10位元可以用來對字元進行編碼,正好能容納U'的20位。 4) 將U'的高10位分配給W1的低10位,將U'的低10位分配給W2的低10位,處理結束。用數字來表示,第2步到第4步如下所示: U' = yyyyyyyyyyxxxxxxxxxx W1 = 110110yyyyyyyyyy W2 = 110111xxxxxxxxxx 四 Code 下面的code是簡單的實現一個Unicode轉成UTF-16的功能。沒有實現一批批字元的轉,把這段code改進一下就可以了。
#include
int main()
{
FILE *out ;
long unicode = 74565; //在這裏只拿一個值做個演示0x12345
//U+12345表示為 D8 08 DF 45(UTF-16BE),或者08 D8 45 DF(UTF-16LE)。
long h , l ;
out = fopen("out.txt","wb");
fputwc(L'\xFEFF', out);
if (unicode < 0 unicode >0x10ffff)
{
printf("error!");
}
else
{
if (unicode <0x10000) { fwprintf(out,L"%c", unicode); } else { unicode = unicode - 0x10000 ; long vh = (unicode & 0xFFC00) >> 10 ;
long vl = unicode & 0x3ff;
h = 0xD800 vh;
l = 0xDC00 vl;
fwprintf(out,L"%c",h);
fwprintf(out,L"%c",l);
}
}
}
轉自 波周的BLOG
沒有留言:
張貼留言