C++:UTF-8与GB2312之间的互换

标签: utf gb2312 互换 | 发表时间:2011-09-22 09:54 | 作者:李木 张家良
出处:http://www.cppblog.com/

本文章由李木空间 www.limou.net 发布,转载请注明链接。
话不多说,前几天我就遇到了字符之间的麻烦,在网页中出现了乱码,为此我还写了个百度经验,呵呵。

现在就是解决这个问题的时候了,当然用txt自带的“另存为”就可以简单的转换,但是现在讨论的是如何利用c++中的函数来改变的。

下面介绍一下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 CTest::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 CTest::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 CTest::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* CTest::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_three.Right(2);
	string_two = string_two.Right(2);
	string_one = string_one.Right(2);
	string_three = HexToBin(string_three.Left(1))+HexToBin(string_three.Right(1));
	string_two = HexToBin(string_two.Left(1))+HexToBin(string_two.Right(1));
	string_one = HexToBin(string_one.Left(1))+HexToBin(string_one.Right(1));
	combiString = string_one +string_two +string_three;
	combiString = combiString.Right(20);
	combiString.Delete(4,2);
	combiString.Delete(10,2);
	Hchar = BinToInt(combiString.Left(8));
	Lchar = BinToInt(combiString.Right(8));
	uchar[1] = (char)Hchar;
	uchar[0] = (char)Lchar;
	unicode = (WCHAR *)uchar;
	return unicode;
}

char * CTest::UnicodeToGB2312(unsigned short uData)  //把Unicode 转换成 GB2312
{
	char *buffer ;
	buffer = new char[sizeof(WCHAR)];
	WideCharToMultiByte(CP_ACP,NULL,&uData,1,buffer,sizeof(WCHAR),NULL,NULL);
	return buffer;
}

GB2312转换成UTF-8:先把GB2312通过函数MultiByteToWideChar转换成Unicode.然后再把Unicode通过拆开Unicode后拼装成UTF-8。

OK!最后依然是惯例,本文章由李木空间 www.limou.net 发布,转载请注明链接。



李木 2011-09-22 09:54 发表评论

相关 [utf gb2312 互换] 推荐:

C++:UTF-8与GB2312之间的互换

- 张家良 - C++博客-首页原创精华区
本文章由李木空间 www.limou.net 发布,转载请注明链接. 话不多说,前几天我就遇到了字符之间的麻烦,在网页中出现了乱码,为此我还写了个百度经验,呵呵. 现在就是解决这个问题的时候了,当然用txt自带的“另存为”就可以简单的转换,但是现在讨论的是如何利用c++中的函数来改变的. 下面介绍一下WinAPI的两个函数:WideCharToMultiByte、MultiByteToWideChar.

UTF-8 GBK UTF8 GB2312 之间的区别和关系

- 维维孙 - 博客园-首页原创精华区
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM. 是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码. UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强. UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示.

扯谈下UTF-8

- - CSDN博客推荐文章
本来想翻译这篇文章的(作者是utf-8编码,golang发明者之一):. 一则翻译起来很痛苦,二则觉得这篇文章有些地方可能说得不是太明白,所以结合其它的一些东东扯谈下utf-8. Unicode就是为每一个字符(各种语言的各种字符)分配一个数字. 所以它实际上是一个表,记录了字符和数字的对应关系. 比如汉字“你”,对应的数字是20320,16进制是4F60.

java UTF-8 和 UTF-8 without BOM工具处理类

- - CSDN博客推荐文章
作者:shefron 发表于2014-8-27 15:52:22 原文链接. 阅读:6 评论:0 查看评论.

utf-8编码已经成为主流

- hongleij - 阮一峰的网络日志
今天,我在网上看到一张图,据说是来自Google内部的统计——世界上所有网页编码统计图. 第一眼看到这张图,我感到很振奋,utf-8编码终于成为了主流. 可是再看第二眼,顿时就泄气了. 因为份额下降的是ASCII和ISO 8859-1这两类编码,而GB类的中文编码份额几乎保持不变. 那样的话,utf-8编码份额的上升,其实没有多大实际意义,因为ASCII和ISO 8859-1本身就是同utf-8兼容的,转不转化无所谓.

中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

- - 博客园_学院派的驴
转自: http://hi.baidu.com/okptqdwpfrbosuq/item/0fc063f8b65f0516d6ff8c03. 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030. 转自: http://www.blog.edu.cn/user3/flyingcs/archives/2006/1418577.shtml 概要:UTF-8的一个特别的好处是它与ISO- 8859-1完全兼容,可以表示世界上所有的字符,汉字通常用3个字节来表示.

UTF-8编码中BOM的检测与删除

- 競 - 火丁笔记
所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space. 注:Unicode相关知识的详细介绍请参考UTF-8, UTF-16, UTF-32 & BOM.

字符编码笔记:ASCII,Unicode和UTF-8

- - 移动开发 - ITeye博客
今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思路. 但是,我尽量试图写得通俗易懂,希望能对其他朋友有用. 毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识.

JAVA ,SSH中文及其乱码问题的解决 6大配置点 使用UTF-8编码

- - CSDN博客编程语言推荐文章
JSP,mysql,tomcat下(基于struts2)中文及其乱码问题的解决 6大配置点 使用UTF-8编码. 目前对遇到J2EE 开发中 中文及其乱码问题,参考网上资料做个总结, 主要是6大配置点:. 1 struts2配置 2 数据库 3 页面 4 jdbc连接 5 tomcat 6.hibernate配置.

商标互换,当Google长了一副Bing的模样……

- wade - 理想生活实验室
商标往往最能代表产品的个性和风格,设计师 Graham 'Logo' Smith 把同一领域内两个或者三个顶尖产品的商标设计风格对调并加以重新设计,使这些新商标看上去陌生又熟悉,同时也让人忍不住默默地对比各产品在服务质量和企业文化等方面的异同,起到以小见大的作用. 产品大家都很熟悉,就不一一介绍了,看图吧.