现在的位置: 首页 > 综合 > 正文

utf8编码转化为unicode的一个精彩函数

2012年09月17日 ⁄ 综合 ⁄ 共 1988字 ⁄ 字号 评论关闭

     UTF-8就是对unicode编码的一种实现, UTF-8的一个特别的好处是它与ISO-8859-1完全兼容。UTF-8就是以8位为单元对UCS进行编码。从UCS-2UTF-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
// output:
// 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;
}
 
示例:
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:
1110xxxx 10xxxxxx 10xxxxxx。
将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

 

抱歉!评论已关闭.