当前位置: 首页 > 图文教程 > 开发语言 > VC++ > UTF-8与GB2312之间的互换

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 UTF-8与GB2312之间的互换


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 114 ::
收藏到网摘: n/a

UTF-8与GB2312之间的互换

作者:吴康彬

  相信一定有不少的程序开发人员时常会遇到字符编码的问题,而这个问题也是非常让人头痛的。因为这些都是潜在的错误,要找出这些错误也得要有这方面的开发经验才行。特别是在处理xml文档时 ,该问题的出现就更加的频繁了,有一次用java写服务器端程序,用vc写客户端与之交互。交互的协议都是用xml写的。结果在通讯时老是发现数据接受不正确。纳闷!于是用抓取网络数据包工具抓取数据,后来才发现原来是java上xml的头是这样的<?xml version="1.0" encoding="UTF-8"?>,而vc上默认的是GB2312。所以一遇到汉字数据就不正确了。去网上找资料,这方面的文章好象特别少,针对像这样的问题,下面我介绍一下我自己写的一个转换程序。当然,程序很简单。如果有画蛇添足的地方,还望各位高手一笑了之。
  如果您对UTF-8、Unicode、GB2312等还是很陌生的话,请查看http://www.linuxforum.net/books/UTF-8-Unicode.html,我这里就不浪费口舌了。下面介绍一下WinAPI的两个函数:WideCharToMultiByte、MultiByteToWideChar。

函数原型:
int WideCharToMultiByte(	UINT CodePage, // code page	DWORD dwFlags, // performance and mapping flags	LPCWSTR lpWideCharStr, // wide-character string	int cchWideChar, // number of chars in string	LPSTR lpMultiByteStr, // buffer for new string	int cbMultiByte, // size of buffer	LPCSTR lpDefaultChar, // default for unmappable chars	LPBOOL lpUsedDefaultChar // set when default char used); //将宽字符转换成多个窄字符int MultiByteToWideChar(	UINT CodePage, // code page	DWORD dwFlags, // character-type options	LPCSTR lpMultiByteStr, // string to map	int cbMultiByte, // number of bytes in string	LPWSTR lpWideCharStr, // wide-character buffer	int cchWideChar // size of buffer);//将多个窄字符转换成宽字符 
需要用到的一些函数:
CString CXmlProcess::HexToBin(CString string)//将16进制数转换成2进制{	if( string == "0") return "0000";	if( string == "1") return "0001";	if( string == "2") return "0010";	if( string == "3") return "0011";	if( string == "4") return "0100";	if( string == "5") return "0101";	if( string == "6") return "0110";	if( string == "7") return "0111";	if( string == "8") return "1000";	if( string == "9") return "1001";	if( string == "a") return "1010";	if( string == "b") return "1011";	if( string == "c") return "1100";	if( string == "d") return "1101";	if( string == "e") return "1110";	if( string == "f") return "1111";	return "";}CString CXmlProcess::BinToHex(CString BinString)//将2进制数转换成16进制{	if( BinString == "0000") return "0";	if( BinString == "0001") return "1";	if( BinString == "0010") return "2";	if( BinString == "0011") return "3";	if( BinString == "0100") return "4";	if( BinString == "0101") return "5";	if( BinString == "0110") return "6";	if( BinString == "0111") return "7";	if( BinString == "1000") return "8";	if( BinString == "1001") return "9";	if( BinString == "1010") return "a";	if( BinString == "1011") return "b";	if( BinString == "1100") return "c";	if( BinString == "1101") return "d";	if( BinString == "1110") return "e";	if( BinString == "1111") return "f";	return "";}int CXmlProcess::BinToInt(CString string)//2进制字符数据转换成10进制整型{	int len =0;	int tempInt = 0;	int strInt = 0;	for(int i =0 ;i < string.GetLength() ;i ++)	{ tempInt = 1; strInt = (int)string.GetAt(i)-48; for(int k =0 ;k < 7-i ; k++) {	tempInt = 2*tempInt; } len += tempInt*strInt;	}	return len;} 
  UTF-8转换成GB2312先把UTF-8转换成Unicode.然后再把Unicode通过函数WideCharToMultiByte转换成GB2312
WCHAR* CXmlProcess::UTF_8ToUnicode(char *ustart) //把UTF-8转换成Unicode{	char char_one;	char char_two;	char char_three;	int Hchar;	int Lchar;	char uchar[2];	WCHAR *unicode;	CString string_one;	CString string_two;	CString string_three;	CString combiString;	char_one = *ustart;	char_two = *(ustart+1);	char_three = *(ustart+2);	string_one.Format("%x",char_one);	string_two.Format("%x",char_two);	string_three.Format("%x",char_three);	string_three = string_thr