40.linux下安装libiconv库:GB2312与UTF-8转码测试

一: libiconv库简介:

libiconv库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。

随着互联网时代的到来,通过互联网进行文字交流也逐渐增多:浏览外国的网站,这个时候字符编码的转换变得尤为重要。这带来了一个问题,就是许多字符在某一种编码方式中没有。为了解决这种混乱,Unicode的编码方式被建立。Unicode是一种超级编码包含了所有这些编码的字符集,因此一些新的文本格式像XML的默认编码方式就是Unicode.

但是很多老式的计算机还在使用当地的传统的字符编码方式。而一些程序,例如邮件程序和浏览器必须能在这些不同的用户编码之间作转换。其他的一些程序则内置支持Unicode,以顺利支持国际化的处理,但是仍然有在Unicode和其他的传统编码之间转换的需求。GNU的libiconv就是为这两种应用设计的编码转换库。

二:下载:

官网下载:

http://www.gnu.org/software/libiconv/

三:编译:

sudo tar -zxvf libiconv-1.15.tar.gz -C .
sudo chown -R aston libiconv-1.15/
mkdir install_lib
sudo ./configure --prefix=/home/aston/huawei/libiconv-1.15/install_lib
sudo make
sudo make install

四:测试:

1.代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>

int code_convert(char *from_charset, char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
	iconv_t cd;
	char **pin = &inbuf;
	char **pout = &outbuf;

	cd = iconv_open(to_charset, from_charset);
	if (cd == 0)
	{
		return -1;
	}
	
	memset(outbuf, 0, outlen);
	if (iconv(cd, pin, &inlen, pout, &outlen) == -1)
	{
		return -1;
	}
		
	iconv_close(cd);
	*pout = '\0';

	return 0;
}

int u2g(char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
	return code_convert((char *)"utf-8", (char *)"gb2312", inbuf, inlen, outbuf, outlen);
}

int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
	return code_convert((char *)"gb2312",(char *) "utf-8", inbuf, inlen, outbuf, outlen);
}

int main()
{
	char buf[16] = "粤";
	char buf2[16] = {0};

	int i = 0;

	for (i = 0; i < strlen(buf); i ++)
	{
		printf("[%s:%d]:[yang]  buf[%d] = 0X%02X\n",__FUNCTION__,__LINE__,i ,buf[i]);
	}
		
	printf("[%s:%d]:[yang] buf = %s\n",__FUNCTION__,__LINE__,buf);
	
	g2u(buf, strlen(buf), buf2, sizeof(buf2));

	for (i = 0; i < strlen(buf2); i ++)
	{
		printf("[%s:%d]:[yang]  buf2[%d] = 0X%02X\n",__FUNCTION__,__LINE__,i ,buf2[i]);
	}
	printf("[%s:%d]:[yang] buf2 = %s\n",__FUNCTION__,__LINE__,buf2);

	return 0;
}

编译:

aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_libiconv$ make
g++ test_libiconv.cpp -g -I./include -L./lib -liconv -lcharset -lcharset -ldl -lpthread -lz -o app.out

打印:将gb2312格式的"粤"字,转码为了UTF-8的格式(Xshell此时配置为UTF-8所以可正常显示);

aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_libiconv$ ./app.out 
[main:49]:[yang]  buf[0] = 0XFFFFFFD4
[main:49]:[yang]  buf[1] = 0XFFFFFFC1
[main:52]:[yang] buf = Ձ
[main:58]:[yang]  buf2[0] = 0XFFFFFFE7
[main:58]:[yang]  buf2[1] = 0XFFFFFFB2
[main:58]:[yang]  buf2[2] = 0XFFFFFFA4
[main:60]:[yang] buf2 =

在这里插入图片描述

2.将Xshell配置为GB2312格式,则buf显示"粤",buf2显示不对;

aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_libiconv$ ./app.out 
[main:49]:[yang]  buf[0] = 0XFFFFFFD4
[main:49]:[yang]  buf[1] = 0XFFFFFFC1
[main:52]:[yang] buf =[main:58]:[yang]  buf2[0] = 0XFFFFFFE7
[main:58]:[yang]  buf2[1] = 0XFFFFFFB2
[main:58]:[yang]  buf2[2] = 0XFFFFFFA4
[main:60]:[yang] buf2 =//这里应该是乱码,凑巧E7B2是汉字“绮”的gb2312编码;

在这里插入图片描述

3.汉字"粤"的字符编码集:在这里插入图片描述
4.当Xshell配置为GB2312格式时,buf2显示"绮"的原因是:
“绮”的gb2312编码是:E7B2
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值