vc mfc 中文乱码,怎么解决

VC6.0中默认使用的是多字节编码,而从VS2005以后,默认使用的是Unicode字符编码方式,尤其在VS2013中还取消了对于多字节编码的支持,需要额外安装插件。如果使用多字节编码就不会遇到本文所说的问题,但是用Unicode字符编码方式也是有好处的,除了支持程序主题更美观,更重要的是统一编码标准。这或许就是vs中取消多字节编码的一个原因吧。
好,切入正题。在socket编程中,如果使用的Unicode编码,接收的到数据会发生乱码或者只接收到了第一个字符,那么要如何解决呢?我们只需要在发送数据的时候通过以下方式进行转换,就能够正常运行了:int nL
char * wsabuf = NULL;
#ifdef _UNICODE
//CString转换成char*
USES_CONVERSION;
wsabuf = W2A(m_strMsg);//m_strMsg为CString消息
nLen = strlen(wsabuf);
nSent = m_sConnectSocket.Send(wsabuf, nLen);//发送数据
nLen = m_strMsg.GetLength();
nSent = m_sConnectSocket.Send(LPCTSTR(m_strMsg), nLen);//发送数据
#endif注意如果出现函数未定义的错误就包含一下头文件://#include &afxconv.h&
MFC下拉列表数据顺序乱排解决方法
C#中使用GetPrivateProfileString API读INI文件,读到的中文字符串乱码
MFC窗口中汉字出现乱码
mfc读取中文乱码
VS2013 MFC 控件中文名称乱码
MFC用CStdioFile类读取中文文本时乱码问题的一种解决方法
没有更多推荐了,方法其实很简单,只需将stdafx.h中的下面的代码中的首行与末行的代码注释掉即可。
//#ifdef _UNICODE#if defined _M_IX86#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='ccf1df' language='*'/"")#elif defined _M_IA64#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='ccf1df' language='*'/"")#elif defined _M_X64#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='ccf1df' language='*'/"")#else#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='ccf1df' language='*'/"")#endif//#endif
关于 VS2008 字符集改用多字节字符集时,控件显示样式变为旧样式的问题的解决
如何使得WIN7下用VS2010做出的MFC程序具有XP风格(摆脱传统界面的效果)
VS2008或2010 字符集改用多字节字符集时界面发生变化的解决方法
如何设置VS2005风格环境
VS2010-MFC下控件Win7风格设置
没有更多推荐了,sqlite中文乱码问题原因分析及解决
转载 &更新时间:日 15:53:14 & 作者:
打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常,这是由于sqlite数据库使用的是UTF-8编码方式
在VC++中通过sqlite3.dll接口对sqlite数据库进行操作,包括打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常。例如调用sqlite3_open打开数据库文件,如果文件路径出现中文,就会导致打开失败。sqlite3_exec执行sql语句,如果包含中文对应字符就会变成乱码。这是由于sqlite数据库使用的是UTF-8编码方式,而传入的字符串是ASCII编码或Unicode编码,导致字符串格式错误。解决方案是在调用sqlite接口之前,先将字符串转换成UTF-8编码,以下提供各种字符串编码转换函数。
代码如下: //UTF-8转Unicode std::wstring Utf82Unicode(const std::string& utf8string) { int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0); if (widesize == ERROR_NO_UNICODE_TRANSLATION) { throw std::exception("Invalid UTF-8 sequence."); } if (widesize == 0) { throw std::exception("Error in conversion."); } std::vector&wchar_t& resultstring(widesize); int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize); if (convresult != widesize) { throw std::exception("La falla!"); } return std::wstring(&resultstring[0]); } //unicode 转为 ascii string WideByte2Acsi(wstring& wstrcode) { int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL); if (asciisize == ERROR_NO_UNICODE_TRANSLATION) { throw std::exception("Invalid UTF-8 sequence."); } if (asciisize == 0) { throw std::exception("Error in conversion."); } std::vector&char& resultstring(asciisize); int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL); if (convresult != asciisize) { throw std::exception("La falla!"); } return std::string(&resultstring[0]); } //utf-8 转 ascii string UTF_82ASCII(string& strUtf8Code) { string strRet(""); //先把 utf8 转为 unicode wstring wstr = Utf82Unicode(strUtf8Code); //最后把 unicode 转为 ascii strRet = WideByte2Acsi(wstr); return strR } /////////////////////////////////////////////////////////////////////// //ascii 转 Unicode wstring Acsi2WideByte(string& strascii) { int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0); if (widesize == ERROR_NO_UNICODE_TRANSLATION) { throw std::exception("Invalid UTF-8 sequence."); } if (widesize == 0) { throw std::exception("Error in conversion."); } std::vector&wchar_t& resultstring(widesize); int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize); if (convresult != widesize) { throw std::exception("La falla!"); } return std::wstring(&resultstring[0]); } //Unicode 转 Utf8 std::string Unicode2Utf8(const std::wstring& widestring) { int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL); if (utf8size == 0) { throw std::exception("Error in conversion."); } std::vector&char& resultstring(utf8size); int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL); if (convresult != utf8size) { throw std::exception("La falla!"); } return std::string(&resultstring[0]); } //ascii 转 Utf8 string ASCII2UTF_8(string& strAsciiCode) { string strRet(""); //先把 ascii 转为 unicode wstring wstr = Acsi2WideByte(strAsciiCode); //最后把 unicode 转为 utf8 strRet = Unicode2Utf8(wstr); return strR }
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具文章转载自
最近在使用VS2008编写一个基于对话框的程序时,在对话框中添加Static控件,编写其Caption时写中文的话会出现乱码。
在预览状态下(快捷键是Ctrl+T)可能看到中文,但是编译运行后对话框中的中文全是问号。
即使你用的VS2008中文版,即使你也用了Unicode编码,即使有条件编译
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
但是问题依旧对不对?
有的同志通过SetWindowText(_T("中文显示"));来手工替代,的确可以达到同样的效果。可是如果界面中有十几二十个呢?
其实解决办法很简单。
首先到“资源视图”[Resource View]中找到对话框的ID号,对其右击选择“属性”[Properties],然后在右边的属性栏中找到“语言”[Language]项,默认是英语(美国),改成中文(中国),OK,问题解决。
这样既可以正常显示中文,又可以显示英文,一举两得,省了不少麻烦。
如果你所有的对话框程序都是中文的话建议在建立项目的时候务必把“资源语言”[Resorce Language]设置为“中文(中国)”。
这样在后期就不用担心遇到这样棘手的问题了。
MFC app 界面乱码
MFC中MessageBox显示乱码问题解决方法
对于Visual Studio C++ 2008环境中出现运行时MFC对话框中文乱码的解决方案
VS2008中MFC界面编程Caption中文全是乱码的解决办法
MFC 对话框中文变问号的解决办法
没有更多推荐了,MFC 读取文件在EditControl显示是乱码,怎么解决_百度知道
MFC 读取文件在EditControl显示是乱码,怎么解决
详细代码:CS//打开的文件名字符串CF//文件对象DWORD//用于保存文件长度CFileDialogdlg(TRUE,_T(&&),_T(&*.*&),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(...
详细代码:
// 打开的文件名字符串
// 文件对象
// 用于保存文件长度
CFileDialog
dlg(TRUE,_T(&&),_T(&*.*&),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(&*.*|*.*|&));
DWORD local_1 = dlg.DoModal ();
if(IDOK== local_1){
filename = dlg.GetPathName(); }
else if( IDCANCEL == local_1){
// 读取数据
file.Open(filename,CFile::modeReadWrite);
len = file.GetLength();
char *pReadData = new char[len+1]; // 分配内存
file.Read(pReadData,len);
这里保存的读取文件的数据 pReadData[len] = 0; CString data(pReadData); file.Close();
CEdit* pBoxO
pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT1);
pBoxOne -& SetWindowText(data );
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:484
获赞数:1598
你先看看你的Visual Studio是什么版本的,如果不是VC6的话那么生成的项目默认是使用UNICODE编码,但是你在读取文件的时候读取的是ANSI的文本,直接设置到editbox所以就出现乱码了。如果是这个原因的话,你在SetWindowText的时候使用SetWindowTextA函数,强迫使用ANSI格式::SetWindowTextA(pBoxOn-&m_hWnd, data);
这个问题已经解决了。谢谢。但又有新的问题,能不能帮忙解决一下。读取Edit Control的内容写到文件中,如果是打开的文件内容,写入文件后不换行,而且只能写入前面一部分。如果是自己输入的内容,只能读取第一行,而且汉字是乱码。代码如下:
关于写入的文件只有一部分以及汉字乱码的问题实际上都是UNICODE造成的,因为你从EDIT里面获取的CString是UNICODE的,所以写入的文本也是unicode的,一个unicode占2个字节,假如你一个文件本来100个字符,你写的时候写100个字节(这是你的len=str.GetLenght()获取的字符数),实际上只写了50个字符,所以看上去就只有前面一部分了,而对于unicode的汉字使用ansi方式来打开的话自然就是乱码了(因为没有写如uncode文本头,所以notepad默认使用ansi方式打开)。解决的方法还是可以使用windows的ansi API.至于你说的不换行的问题,我没有碰到,暂时不知道原因,不过你可以参考下我附件的完整代码看看哪儿不一样。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 vc6.0mfc编程实例 的文章

 

随机推荐