首先值得說明的是UTF-16到Unicode和UTF-8到Unicode是不一樣的,不可以用Windows的API函數MultiByteToWideChar,因為他只支持UTF-8不支持UTF-16.所以我們必須按編碼規則來轉。
將單個字元從UTF-16解碼為Unicode值的步驟如下。設W1為待解碼文字中第一個16位元的整數,設W2為跟在W1後的整數(如果有的話)。
1) 如果W1小於0xD800或者W1大於0xDFFF,字元的值U就是W1的值,處理結束。
2) 判斷W1的值是否介於0xD800和0xDBFF之間。如果不是,那麼順序有誤,而且用W1將不能解碼出任何合法字元。處理結束。
3) 如果沒有W2(也就是說,以W1結尾),或者雖然有W2,但不是介於0xDC00和0xDFFF之間,那麼順序同樣有錯。處理結束。
4) 建立一個20位元的無符號整數U',將W1的低10位作為U'的高10位,將W2的低10位作為U'的低10位。
5) 將U'的值加上0x10000以得到字元U的值,處理結束。
二 code
#include /stdio.h>
#include /stdlib.h>
int main()
{
FILE *out;
long sour[] = {0xfeff , 0xd808 , 0xdf45};
//由兩個UTF-16字元,一個是XFFEF,一個是xd808 , 0xdf45
long i = 0 ;
long len = 2 ;
out = fopen("out2.txt","wb");
while(i < len) { if (sour[i]<0xD800 || sour[i]>0xDFFF)
{
printf("%x\n",sour[i] , sour[i]);
i = i + 1;
}
if (sour[i]>0xd800 && sour[i] < 0xdbff) { sour[i] = sour[i] - 0xD800; long h = sour[i] ; i = i + 1 ; if (i > len)
{
printf("not have W2 error!\n");
}
else if (sour[i]>0xDC00 && sour[i] < 0xdfff) { sour[i] = sour[i] - 0xDC00; long l = sour[i]; i = i + 1 ; long unicode = (h << 10) | l + 0x10000 ; printf("%x", unicode); } else { printf("error W2\n"); } } else { printf("error w1 \n"); } } }
#include
int main()
{
FILE *out;
long sour[] = {0xfeff , 0xd808 , 0xdf45};
//由兩個UTF-16字元,一個是XFFEF,一個是xd808 , 0xdf45
long i = 0 ;
long len = 2 ;
out = fopen("out2.txt","wb");
while(i < len) { if (sour[i]<0xD800 || sour[i]>0xDFFF)
{
printf("%x\n",sour[i] , sour[i]);
i = i + 1;
}
if (sour[i]>0xd800 && sour[i] < 0xdbff) { sour[i] = sour[i] - 0xD800; long h = sour[i] ; i = i + 1 ; if (i > len)
{
printf("not have W2 error!\n");
}
else if (sour[i]>0xDC00 && sour[i] < 0xdfff) { sour[i] = sour[i] - 0xDC00; long l = sour[i]; i = i + 1 ; long unicode = (h << 10) | l + 0x10000 ; printf("%x", unicode); } else { printf("error W2\n"); } } else { printf("error w1 \n"); } } }
轉自 波周的BLOG
沒有留言:
張貼留言