UTF-8就是对unicode编码的一种实现, UTF-8的一个特别的好处是它与ISO-8859-1完全兼容。UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
//------------------------------------------------//
// function name: UCode
// input: const BYTE*& src
// function name: UCode
// input: const BYTE*& src
// output:
// return: WORD
// return: WORD
// 0 -- 返回0的情形:1)是个ascii字符,且已经读到字符串尾了;2)它是个utf8多字节编码的,但里面的字符里的字节是非法的,//无效的。3)是它没涉及到的,即可能是用超过3byte编码的字符串,没处理过,可能会出现0。
// word--返回unicode的编码
// description: 获取编码,输入的utf8编码的第一个字节指针,输出为它的2byte unicode编码
//------------------------------------------------//
inline WORD UCode(
const
BYTE
*&
src)

...
{
WORD ucode;
if (src[0] < 0x80) // is ascii

...{
return *src ? *src++ : 0; //0 means: it’s the string’s end
}
if (src[0] < 0xE0) // process utf8 use 2 char., 0xE0=111xxxxx

...{
if (src[1] && (src[0] & 0x1F)) // make sure src[0],src[1] is effect char

...{ //0x1F=00011111(5个1), 0x3F=00111111(6个1)
ucode = ((src[0] & 0x1F) << 6) | (src[1] & 0x3F);
//if (0x80)unicode=(11000100
src += 2;
}
else

...{
src++;
return 0; //0 means: it isn’t an effect dwcs
}
}
else //use utf8 more then 2bytes

...{
if (src[1] && (src[0] & 0xF)) //utf8 use 3 char

...{
if (src[2] && (src[1] & 0x3F))

...{
ucode = ((src[0] & 0xF) << 12) | ((src[1] & 0x3F) << 6) | (src[2] & 0x3F);
src += 3;
}
else

...{
src += 2;
return 0; //no effect char
}
}
else

...{
src++;
return 0; //no effect char
}
} //if char use morethen 3 char, how to do it?
return ucode;
}
// word--返回unicode的编码
// description: 获取编码,输入的utf8编码的第一个字节指针,输出为它的2byte unicode编码
//------------------------------------------------//























































示例:
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:
1110xxxx 10xxxxxx 10xxxxxx。
将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。