请教一个字符集转换的问题

自由之眼 2009-11-20 11:56:33
我有一个Ini配置文件时这么写的(配置文件是Java写的)
ServerNamwe=\u5E74\u56FD

我把字符串读取出来,我想在C++里面把它转成中文,请问有什么好的方法吗?

char* pData = "\\u5E74\\u56FD"
char* pDataUTF = "\u5E74\u56FD\"

printf_s("UTF8 = %s.\n", pDataUTF); //输出时正确的"年国"
printf_s("UTF8 = %s.\n", pData); //输出的是"\u5E74\u56FD"

我想把 pData 转换成 "年国"

请教高手了,我将怎么做?

我尝试把5E74变为两个字节存储进去,但是我发现时乱码 5E 74。而pDataUTF的前两个字节是C4 EA。
它们之间的对应关系应该是怎样的呀?
谢谢大家了。
...全文
94 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bragi523 2009-11-23
  • 打赏
  • 举报
回复
jf
自由之眼 2009-11-23
  • 打赏
  • 举报
回复
我知道了,谢谢大家,还是我对字符集的转换不熟悉。已经解决了,测试代码贴在下面,测试通过。给分。
bool Unicode2Ascii(char* szUnicode , int nUnicode, char* szAscii, int& nAscii)
{
wchar_t wszString;
memcpy(&wszString, szUnicode, nUnicode);

int u8Len = WideCharToMultiByte(CP_ACP, NULL, &wszString, 1, NULL, 0, NULL, NULL);
if(u8Len == ERROR_NO_UNICODE_TRANSLATION)
{
return false;
}

WideCharToMultiByte(CP_ACP, NULL, &wszString, 1, szAscii, u8Len, NULL, NULL);
szAscii[u8Len] = '\0';

nAscii = u8Len;
return true;
}

bool Ascii2Unicode(char* szAscii , int& nAscii, char* szUnicode, int nUnicode)
{
return true;
}

bool DecodeUnicode(char* pSrc, char* pDes)
{
char szData;
char szChar;
int nUnicode = 0;
for(int i = 0; i < 4; i++)
{
szChar = pSrc[i];
switch(szChar)
{
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
{
nUnicode = (nUnicode << 4) + szChar - '0';
break;
}
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
{
nUnicode = (nUnicode << 4) + 10 + szChar - 'a';
break;
}
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
{
nUnicode = (nUnicode << 4) + 10 + szChar - 'A';
break;
}
default:
return false;
}
}

memcpy_s(pDes, 2, &nUnicode, 2);
return true;
}

bool UnicodeChange(char* pSrc, int nSrcLen, char* pDes, int& nDes)
{
char* pPos = NULL;
char* pBefore = NULL;
char* pUniBegin = NULL;
char* pNuiEnd = NULL;
char szUnicode[5] = {'\0'};
char szUnCode[2] = {'\0'};
char szAscCode[3] = {'\0'};

int nPos = 0;
int nUnicode = 0;

pBefore = pSrc;
pPos = pSrc;

while(true)
{
pUniBegin = strstr(pPos, "\\u");
if(NULL == pUniBegin)
{
break;
}

int nLen = pUniBegin - pBefore;
if(nLen > 0)
{
char* pTemp = new char[nLen + 1];
memcpy(pTemp, pBefore, nLen);
pTemp[nLen] = '\0';

memcpy(&pDes[nPos], pBefore, nLen);
nPos += nLen;
}

memcpy(szUnicode, pUniBegin + (int)strlen("\\u"), 4);
szUnicode[4] = '\0';
DecodeUnicode(szUnicode, szUnCode);
int nAsciiLen = 2;
Unicode2Ascii(szUnCode, 2, szAscCode, nAsciiLen);

memcpy(&pDes[nPos], szAscCode, 2);
nPos += 2;

pBefore = pUniBegin + (int)strlen("\\u") + 4;
pPos = pUniBegin + (int)strlen("\\u") + 4;
}

int nTellLen = nSrcLen - (int)(pPos - pSrc);
if(nTellLen > 0)
{
memcpy(&pDes[nPos], pPos, nTellLen);
pDes[nPos + nTellLen] = '\0';
}
else
{
pDes[nPos] = '\0';
}

return true;
}


int _tmain(int argc, _TCHAR* argv[])
{
//char* szAnsi = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n<Name>aaa<\Name>";
//char szUTF8[200] = {'\0'};
//int nUTF8Len = 200;

//Ascii2Utf8(szAnsi, (int)strlen(szAnsi), szUTF8, nUTF8Len);

//CWriteFile WriteSend;
//WriteSend.SetFile("c.xml", szUTF8, nUTF8Len);
//WriteSend.Close();

//Unicode转换
char szUnicode[200];
int nLen = 200;
char* pData = "60\\u5E74\\u56FD\\u5E86\\uFF0C\\u5341\\u4E00\\u4E0B\\u7684\\u56FD\\u5BB6\\u5927\\u5267\\u9662\\u3002<BR>";
UnicodeChange(pData, (int)strlen(pData), szUnicode, nLen);

printf_s("UTF = %s.\n", szUnicode);

getchar();

return 0;
}
Dingnifei123 2009-11-20
  • 打赏
  • 举报
回复
接分兼学习,
MoXiaoRab 2009-11-20
  • 打赏
  • 举报
回复

void ConvertUtf8ToGBK(CString& strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;

return;
}
wfx_net 2009-11-20
  • 打赏
  • 举报
回复
char* pData = "\\u5E74\\u56FD"
这是什么呀,你多加一个\把\u的转义都去掉了。
自由之眼 2009-11-20
  • 打赏
  • 举报
回复
能给一个详细的例子吗?
用户 昵称 2009-11-20
  • 打赏
  • 举报
回复
java只支持unicode,实际使用的是utf16,要在c++中使用utf16汉字,要看你当前的线程或者进程或者程序是unicode还是ansi的。

如果是unicode程序,则将字符\uXXXX的直接存储到wchar中即可。

如果是ansi程序,需要先将\uXXXX存储到wchar中,再利用1楼的方法。
  • 打赏
  • 举报
回复
先用MultiByteToWideChar 将utf-8转化成unicode
再用WideCharToMultiByte 将unicode转化成ascii

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧