linux下utf8编码转Unicode编码

在网上找了转换的api只能转出一个汉字,怎么转整个字符串,以下是代码,希望各位大神指点一下

int Utf8ToUnicode(char* pInput, char* pOutput)

{

int outputSize = 0; //记录转换后的Unicode字符串的字节数

while (*pInput)  
{  
    if (*pInput > 0x00 && *pInput <= 0x7F) //处理单字节UTF8字符(英文字母、数字)  
    {  
        *pOutput = *pInput;  
         pOutput++;  
        *pOutput = 0; //小端法表示,在高地址填补0  
    }  
    else if (((*pInput) & 0xE0) == 0xC0) //处理双字节UTF8字符  
    {  
        char high = *pInput;  
        pInput++;  
        char low = *pInput;  
        if ((low & 0xC0) != 0x80)  //检查是否为合法的UTF8字符表示  
        {  
            return -1; //如果不是则报错  
        }  

        *pOutput = (high << 6) + (low & 0x3F);  
        pOutput++;  
        *pOutput = (high >> 2) & 0x07;  
    }  
    else if (((*pInput) & 0xF0) == 0xE0) //处理三字节UTF8字符  
    {  
        char high = *pInput;  
        pInput++;  
        char middle = *pInput;  
        pInput++;  
        char low = *pInput;  
        if (((middle & 0xC0) != 0x80) || ((low & 0xC0) != 0x80))  
        {  
            return -1;  
        }  
        *pOutput = (middle << 6) + (low & 0x3F);//取出middle的低两位与low的低6位,组合成unicode字符的低8位  
        pOutput++;  
        *pOutput = (high << 4) + ((middle >> 2) & 0x0F); //取出high的低四位与middle的中间四位,组合成unicode字符的高8位  
    }  
    else //对于其他字节数的UTF8字符不进行处理  
    {  
        return -1;  
    }  
    pInput ++;//处理下一个utf8字符  
    pOutput ++;  
    outputSize += 2;  
}  
//unicode字符串后面,有两个\0  
*pOutput = 0;  
 pOutput++;  
*pOutput = 0;  
return outputSize;  

}

大概看了下这个代码,思路没有错。如果代码来源可靠,那么很可能是你调用的问题,比如你用的printf strcpy之类的函数,截断了unicode string的\0,其实转换本身是成功的。

在linux下用iconv命令,

iconv -f ucs-2 -t utf-8 myfile > destfile

搞了半天,发现,Unicode编码(简称为ucs)其实分为

ucs-2be 和ucs-2se 一个是大端法(big-endian),一个是小端法(little-endian),也就是一个码子(2byte)的字节序列不同。windows下是小端法,Linux平台下是大端法.

因此,需要明确指出是那种ucs编码。(比较奇怪的是,这个文件是linux平台产生的,我运行iconv的也是在linux平台,为什么ucs-2不是默认的ucs-2be呢)

iconv -f ucs-2be -t utf-8 myfile > destfile

就好了。

这个是我的utf8转Unicode,希望对你有帮助

char * UTF_8ToUnicode(char pText, char unicode)
{
/* http://blog.csdn.net/liuzhiyuan1982/article/details/3911150
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
*/
char *uchar = (char *)unicode;
uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
return unicode;
}

char * TranslateUTF8ToUnicodeStr(char str, size_t len)
{
// char
newCharBuffer = new char[len + 1];
int index = 0;
int nCBIndex = 0;
char* pTemp = new char[len + 1];
memset(pTemp, 0, len + 1);
while (index < len)
{
if (str[index] == 0)
break;
else if (str[index] > 0) // 如果是GB2312的字符

{

break;
}
else //如果是UTF-8的字符

{
UTF_8ToUnicode(str + index, pTemp + nCBIndex); //先把UTF-8转成Unicode

index += 3; //源字符串偏移量3

nCBIndex += 2; //目标字符串偏移量2 因为一个中文UTF-8占3个字节,Unicode占两个字节

}
}
return pTemp;
}