一: 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