从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。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”
忘记说明了,我用的是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;
}
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
改变成UNICODE工程
#7
谢谢,我本来想改成unicode的,可是发现改了以后,许多CString要用到L宏,很麻烦,所以就没改了。
刚刚从网上搜索信息了解到,多字节字符集的中文好像是用的GBK编码。因此我还是尝试一下转为GBK吧。
#8
谢谢,我试一下行不行。
#9
试了,有几个错误。LNK2005和LNK1169
#1
VC6默认是ansi,如果是VC6的话,需要转换下,试试WideCharToMultibyte()
#2
建议设置unicode格式,这样utf8只要转成utf16就行了。
#3
vc6预处理设置为“_MBCS”多字节字符集。
#4
谢谢楼上诸位的回答。
忘记说明了,我用的是vs 2010 。
工程使用的是Multi-Byte Character Set。
从网页上抓取的中文字符显示在编辑框控件中是乱码,形如“鍘﹂棬鏄撳悕绉戞妧鏈夐檺鍏”
忘记说明了,我用的是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;
}
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
改变成UNICODE工程
#7
谢谢,我本来想改成unicode的,可是发现改了以后,许多CString要用到L宏,很麻烦,所以就没改了。
刚刚从网上搜索信息了解到,多字节字符集的中文好像是用的GBK编码。因此我还是尝试一下转为GBK吧。
#8
谢谢,我试一下行不行。
#9
试了,有几个错误。LNK2005和LNK1169