最近用VC++做一个自动搜索网页中的相关内容的程序时,遇到返回页面中的中文为乱码的情况。经过检查后,得出是网页的编码问题。网页编码为UTF-8的,用程序返回后,相关的中文为乱码,因为程序默认的编码为GB编码。 在网上搜了些资料,经过自己整理后,写出的UTF-8编码转化为GB2312编码的程序,如下: ******************************************************************************** * 方法功能:把UTF-8编码的字符串转化为gb2312编码的字符串 * 方法参数:str UTF-8编码的字符串 * 返回类型:转化后的gb2312编码的字符串 ******************************************************************************** CString CSpiderThread::UTF8ToGB(CString str) { CString szOut = ""; WCHAR *strSrc; TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); //得到多字节字符的长度
strSrc = new WCHAR[i+1];
MultiByteToWideChar(CP_UTF8, 0, str, -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); //宽字符转为多字节字符
szOut = szRes;
delete []strSrc; delete []szRes;
return szOut; }
以下内容是转载:
1.使用方法详解 在本文开始之处,先简要地说一下何为短字符和宽字符. 所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.
宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水. 好吧,那就让我们开始吧.
这个是我们需要转化的多字节字符串: char sText[20] = {"多字节字符串!OK!"};
我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意. 所幸,我们能够确知所需要的数组空间. 我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数: DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
接下来,我们只需要分配响应的数组空间: wchar_t *pwText; pwText = new wchar_t[dwNum]; if(!pwText) { delete []pwText; }
接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子: MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);
最后,使用完毕当然要记得释放占用的内存: delete []pwText;
同理,宽字符转为多字节字符的代码如下: wchar_t wText[20] = {L"宽字符转换实例!OK!"}; DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE); char *psText; psText = new char[dwNum]; if(!psText) { delete []psText; } WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE); delete []psText;
|