在网上找了转换的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;
}