UTF8编码还原为中文

cclk-1024 2009-11-14 01:48:55
比如“中文”这两个汉字的UTF-8对应的编码为"4E2D,6587"
现在知道了4E2D,6587这些编码,怎么将它还原为中文呢?

谢谢

...全文
487 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cclk-1024 2009-11-14
  • 打赏
  • 举报
回复
已经解决问题了,谢谢大家的帮助,
的确不需要转换,比如
wchar_t name2[]=L"\x5468";
MessageBoxW(m_hWnd,name2,0,MB_OK);
这样可以直接显示,
用户 昵称 2009-11-14
  • 打赏
  • 举报
回复
没错,是utf16
jameshooo 2009-11-14
  • 打赏
  • 举报
回复
这个是UTF-16编码,不需要转换,直接使用,UTF-8编码应该会出现6个字节。
hzy694358 2009-11-14
  • 打赏
  • 举报
回复
其实就是所占的字节数不一样,会产生乱码;给你两个相互转换的函数
/*
*GBK格式转Utf8格式*
*@param strGBK: 待转换的GBK CString
*转换完成后,为Utf8 CString
*/
void XmlDeal::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
/*
*Utf8格式转GBK格式*
*@param strGBK: 待转换的Utf8 CString
*转换完成后,为GBK CString
*/
void XmlDeal::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;
}
tcbhj 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 longkuis 的回复:]
引用 2 楼 tcbhj 的回复:
WideCharToMultiByte

不用还原,本身就是中文,用setlocale

那我这样写:
wchar_t name[]=L"4E2D6587";
size_t wlen=wcslen(name);
size_t clen=WideCharToMultiByte(CP_UTF8,0,name,-1,NULL,0,NULL,NULL);
char *lpRetval=new char[wlen+1];
WideCharToMultiByte(CP_UTF8,0,name,-1,lpRetval,clen+1,NULL,NULL);
lpRetval[wlen]='\0';
setlocale(LC_ALL,".936");
        MessageBox(lpRetval);
显示的仍然为“4E2D6587”,而不是“中文”这两个字呢?

[/Quote]

两种方法,第一种是转换成mbcs;第二种用setlocale是因为有些函数默认不支持中文unicode

L"中文",L"\x2d\x4e\x87\x65"
chehw 2009-11-14
  • 打赏
  • 举报
回复
win32中, UNICODE指的是UTF-16; UTF-8为MultiByte编码。

WCHAR wsz[MAX_PATH]=L"";
DWORD wcb=MultiByteToWideChar(CP_UTF8, szUtf8String, -1, wsz, MAX_PATH, ...);
//如需gb2312编码,
WideCharToMultiByte(CP_ACP, wsz, wcb, ....);

cclk-1024 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tcbhj 的回复:]
WideCharToMultiByte

不用还原,本身就是中文,用setlocale
[/Quote]
那我这样写:
wchar_t name[]=L"4E2D6587";
size_t wlen=wcslen(name);
size_t clen=WideCharToMultiByte(CP_UTF8,0,name,-1,NULL,0,NULL,NULL);
char *lpRetval=new char[wlen+1];
WideCharToMultiByte(CP_UTF8,0,name,-1,lpRetval,clen+1,NULL,NULL);
lpRetval[wlen]='\0';
setlocale(LC_ALL,".936");
MessageBox(lpRetval);
显示的仍然为“4E2D6587”,而不是“中文”这两个字呢?
tcbhj 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 arong1234 的回复:]
从楼主的话你能看出他是需要这种转换?如果他的当前线程编码就是utf-8怎么办?
引用 2 楼 tcbhj 的回复:
WideCharToMultiByte

不用还原,本身就是中文,用setlocale

[/Quote]

你看不出不代表别人看不出

没区别
cclk-1024 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 longkuis 的回复:]
比如“中文”这两个汉字的UTF-8对应的编码为"4E2D,6587"
现在知道了4E2D,6587这些编码,怎么将它还原为中文呢?

谢谢


[/Quote]
对应的编码是4E2D,6587,但是知道的是4E2D,6587假设是CString类型,这个不会是中文字符把?
arong1234 2009-11-14
  • 打赏
  • 举报
回复
从楼主的话你能看出他是需要这种转换?如果他的当前线程编码就是utf-8怎么办?
[Quote=引用 2 楼 tcbhj 的回复:]
WideCharToMultiByte

不用还原,本身就是中文,用setlocale
[/Quote]
tcbhj 2009-11-14
  • 打赏
  • 举报
回复
WideCharToMultiByte

不用还原,本身就是中文,用setlocale
arong1234 2009-11-14
  • 打赏
  • 举报
回复
为什么叫“还原”?UTF-8的"4E2D, 6587"也是中文。

16,472

社区成员

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

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

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