GB2312、GBK、UTF-8 如何转换

【什么是编码】

首先,我们要明白,GB2312、GBK和UTF-8都是一种字符编码。除此之外,还有好多字符编码。只是对于我们中国人的网站来说,用这三种编码比较多。

简单的说一下,为什么要用编码?在计算机内,储存文本信息用ASC II码,每一个字符对应着唯一的ASCII码。最初计算机是由美国发明的,他们也用的是键盘和上面的字母,所以他们的字符ASCII好解决。但是我们中国 的就不同了,每个汉字要对应唯一的ASCII码。这样,就出来了国家制定的字符编码标准:GB2312、GBK等。其他国家,其他语言也有他们对应的编码 标准。

GB 就是国标的意思,GB2312和GBK主要用于汉字的编码,而UTF-8是全世界通用的。意思就是说,如果你的网页主要面对使用汉语的中国人的话,使用 GB2312 和 GBK 非常好,文字储存体积要小,有一些优点。如果你的网页要面向世界的话,你再用GB2312 和 GBK 作为网页编码,有些电脑上的浏览器没有这种编码,你的网页汉字内容就会变成无法识别的乱码。

 

【延伸阅读】

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换(GBK、GB2312 -- Unicode -- UTF8 )

使用UTF-8的一个好处:其他地区的用户(如香港台湾)无需安装简体中文支持就能正常观看你的文字而不会出现乱码。

  • gb2312 是简体中文的码 
  • gbk 支持简体中文及繁体中文 
  • big5 支持繁体中文 
  • utf-8 支持几乎所有字符 

中国大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。 最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号 95年重新修订了编码,命名GBK1.0,共收录了21886个符号。 之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持GBK18030编码。

 

【编码转换】

通常,服务端与客户端之间进行数据传输,涉及到中文,往往都会涉及到编码的转换。服务端在遇到中文时,都会转换为UTF-8格式。而客户端接收到服务端数据时,一般会把该数据的中文字符转为GBK(GB2312)才能正常显示。

//utf8_to_gb2312
	string utf8_to_gb2312(const char* utf8)
	{
		int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
		wchar_t* wstr = new wchar_t[len + 1];
		memset(wstr, 0, len + 1);
		MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
		len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
		char* str = new char[len + 1];
		memset(str, 0, len + 1);
		WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
		string strTemp = str;
		if (wstr) 
			delete[] wstr;
		if (str)
			delete[] str;

		return strTemp;
	}

	//gb2312_to_utf8
	string gb2312_to_utf8(const char* gb2312)
	{
		int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
		wchar_t* wstr = new wchar_t[len + 1];
		memset(wstr, 0, len + 1);
		MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
		len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
		char* str = new char[len + 1];
		memset(str, 0, len + 1);
		WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
		string strTemp = str;
		if (wstr)
			delete[] wstr;
		if (str)
			delete[] str;

		return strTemp;
	}

 

ValueDescription
CP_ACPANSI code page
CP_MACCPNot supported
CP_OEMCPOEM code page
CP_SYMBOLNot supported
CP_THREAD_ACPNot supported
CP_UTF7UTF-7 code page
CP_UTF8UTF-8 code page

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值