MFC默认的中文编码是什么?我从数据库读取的utf-8,显示在编辑框里是乱码

时间:2023-01-05 13:15:18
如题。
从mysql里读取了一些中文字符,然后将这些字符显示在编辑框控件中,结果是乱码。
从utf-8编码的网页上下载过来的中文字符也是乱码。
MFC默认的字符集是什么?要显示utf-8的字符,需要先转换编码吗?

9 个解决方案

#1


VC6默认是ansi,如果是VC6的话,需要转换下,试试WideCharToMultibyte()

#2


建议设置unicode格式,这样utf8只要转成utf16就行了。

#3


vc6预处理设置为“_MBCS”多字节字符集。

#4


谢谢楼上诸位的回答。
忘记说明了,我用的是vs 2010 。
工程使用的是Multi-Byte Character Set。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”

#5


要转换的,把utf8转成GBK
int UTF8ToGBK(CString &strOut,const char* szSrc)
{

if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, NULL, 0);
strSrc = new WCHAR[i+1];
MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, strSrc, i);
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new TCHAR[i+1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
strOut = szRes;
delete []strSrc;
delete []szRes;
return 0;
}
下面这个是相反的,GBK转成UTF8
int GBKToUTF8(CString& strOut, char* szSrc)
{
if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_ACP, 0, szSrc, -1, NULL, 0);
strSrc = new WCHAR[i+1];
MultiByteToWideChar(CP_ACP, 0, szSrc, -1, strSrc, i);
i = WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new TCHAR[i+1];
WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, szRes, i, NULL, NULL);
strOut = szRes;
delete []strSrc;
delete []szRes;
return 0;
}

#6


引用 4 楼 chunxiaoshufa 的回复:
谢谢楼上诸位的回答。
忘记说明了,我用的是vs 2010 。
工程使用的是Multi-Byte Character Set。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”

改变成UNICODE工程

#7


引用 6 楼 gameslq 的回复:
引用 4 楼 chunxiaoshufa 的回复:
谢谢楼上诸位的回答。
忘记说明了,我用的是vs 2010 。
工程使用的是Multi-Byte Character Set。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”

改变成UNICODE工程

谢谢,我本来想改成unicode的,可是发现改了以后,许多CString要用到L宏,很麻烦,所以就没改了。
刚刚从网上搜索信息了解到,多字节字符集的中文好像是用的GBK编码。因此我还是尝试一下转为GBK吧。

#8


引用 5 楼 somuchhope 的回复:
要转换的,把utf8转成GBK
int UTF8ToGBK(CString &strOut,const char* szSrc)
{

if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, szSrc,……

谢谢,我试一下行不行。

#9


引用 5 楼 somuchhope 的回复:
要转换的,把utf8转成GBK
int UTF8ToGBK(CString &strOut,const char* szSrc)
{

if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, szSrc,……


试了,有几个错误。LNK2005和LNK1169

#1


VC6默认是ansi,如果是VC6的话,需要转换下,试试WideCharToMultibyte()

#2


建议设置unicode格式,这样utf8只要转成utf16就行了。

#3


vc6预处理设置为“_MBCS”多字节字符集。

#4


谢谢楼上诸位的回答。
忘记说明了,我用的是vs 2010 。
工程使用的是Multi-Byte Character Set。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”

#5


要转换的,把utf8转成GBK
int UTF8ToGBK(CString &strOut,const char* szSrc)
{

if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, NULL, 0);
strSrc = new WCHAR[i+1];
MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, strSrc, i);
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new TCHAR[i+1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
strOut = szRes;
delete []strSrc;
delete []szRes;
return 0;
}
下面这个是相反的,GBK转成UTF8
int GBKToUTF8(CString& strOut, char* szSrc)
{
if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_ACP, 0, szSrc, -1, NULL, 0);
strSrc = new WCHAR[i+1];
MultiByteToWideChar(CP_ACP, 0, szSrc, -1, strSrc, i);
i = WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new TCHAR[i+1];
WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, szRes, i, NULL, NULL);
strOut = szRes;
delete []strSrc;
delete []szRes;
return 0;
}

#6


引用 4 楼 chunxiaoshufa 的回复:
谢谢楼上诸位的回答。
忘记说明了,我用的是vs 2010 。
工程使用的是Multi-Byte Character Set。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”

改变成UNICODE工程

#7


引用 6 楼 gameslq 的回复:
引用 4 楼 chunxiaoshufa 的回复:
谢谢楼上诸位的回答。
忘记说明了,我用的是vs 2010 。
工程使用的是Multi-Byte Character Set。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”

改变成UNICODE工程

谢谢,我本来想改成unicode的,可是发现改了以后,许多CString要用到L宏,很麻烦,所以就没改了。
刚刚从网上搜索信息了解到,多字节字符集的中文好像是用的GBK编码。因此我还是尝试一下转为GBK吧。

#8


引用 5 楼 somuchhope 的回复:
要转换的,把utf8转成GBK
int UTF8ToGBK(CString &strOut,const char* szSrc)
{

if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, szSrc,……

谢谢,我试一下行不行。

#9


引用 5 楼 somuchhope 的回复:
要转换的,把utf8转成GBK
int UTF8ToGBK(CString &strOut,const char* szSrc)
{

if(szSrc==NULL)
{
strOut="";
return -1;
}
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, szSrc,……


试了,有几个错误。LNK2005和LNK1169