GNU iconv


一、关键函数

1、iconv_open()
iconv_open(DestinationCharsets, SourceCharSets) 2、iconv()
[XSI] [Option Start] #include <iconv.h> size_t iconv(iconv_t cd, char **restrict inbuf,
size_t *restrict inbytesleft, char **restrict outbuf,
size_t *restrict outbytesleft); [Option End]

二、使用异常

1、使用问题①

UTF-8编码的汉字字符串正在安装,即{0xE6,0xAD,0xA3, 0xE5, 0x9C, 0xA8, 0xE5, 0xAE , 0x89 ,0xE8 ,0xA3 ,0x85, 00},在将其转换成GB2312编码的时候出现了错误,提示:

Libiconv:: libiconv invalid incomplete  multibyte character or wide character

查得原因是,iconv()函数的目标字符集和原字符集顺序写反了。iconv_open(DestinationCharsets, SourceCharSets)。例如,如果想将字符集从UTF-8转换到gb2312,调用方法是:iconv_open("gb2312","UTF-8")

2、使用问题②

libiconv munmap_chunk() invalid pointer

问题出现在函数

size_t iconv(iconv_t cd, char **restrict inbuf,
size_t *restrict inbytesleft, char **restrict outbuf,
size_t *restrict outbytesleft); [Option End]

因为参数**outbuf*outbuf均发生了变化,在后面调用那个函数free()的时候,需要用*outbuf原始保存的值(要定义一个临时变量来保存),但是不能用*outbuf这个参数。

REFER:解决munmap_chunk(): invalid pointer和Segmentation fault的bug

三、将libiconv移植到ARM-Linux(Freescale/飞思卡尔)

1、编译libiconv

./configure  CC=arm-linux-gcc --host=arm-linux --enable-shared --prefix=/home/csh/arm/libiconv

其中,选项--host的赋值,只能是arm-linux,一定不能少-linux,否则找不到生成动态库的工具。

2、使用问题

iconv_open: invalid argement,在PC电脑上运行良好,刚移植到ARM上立刻出错。但是使用iconv --list命令,显示包含GB2312字符集。

解决办法:不用/lib/libiconv.so,而是调用/lib/preloadable_libiconv.so。其中,编译libiconv库的时候生成的lib有如下几个:

charset.alias  libcharset.la  libcharset.so.1      libiconv.la  libiconv.so.2      preloadable_libiconv.so
libcharset.a libcharset.so libcharset.so.1.0.0 libiconv.so libiconv.so.2.5.1
export LD_PRELOAD=/lib/preloadable_libiconv.so
./arm_newutf8togb

REFER: ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法

四、原代码

#include <iconv.h>
#include <stdio.h>
#include <locale.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <string.h> void printeverychar(char *text)
{
int size=strlen(text);
int i=0;
for(;i<size;i++)
{
printf("%s[%d] is %d\n",text, i, text[i]);
}
} int main(int argc, char * argv[])
{
size_t ret;
//const char in_utf8[] = {0xE6,0xAD,0xA3, 0xE5, 0x9C, 0xA8, 0xE5, 0xAE , 0x89 ,0xE8 ,0xA3 ,0x85, 00};
char *in_utf8 = "正在安装";
char *in_gb2312= "正在安装";
char **pin = &in_utf8; size_t src_len = strlen(in_utf8)+1;
printf("UTF8 string length is %d\n", src_len); printf("utf8 string is %s\n",in_utf8);
printeverychar(in_utf8); size_t dest_len = 3*src_len;
char *szDest = (char *)malloc(dest_len);
if ( szDest == NULL)
return -1;
memset(szDest,0, dest_len);
char *pdest = szDest; char **pout = &szDest;
// pin=in_utf8; iconv_t conv = iconv_open("gb2312","UTF-8");
if (conv == (iconv_t)-1)
{
perror("iconv_open:");
return -1;
} ret = iconv(conv, pin, &src_len, pout, &dest_len);
if (ret == -1)
{
printf("Ret = %d\n", ret);
perror("iconv:");
return -1;
}
else{
printf("Ret = %d\n", ret);
} printf("dest_len is %d\n", dest_len);
printf("String-out is %s\n",pdest);
printeverychar(pdest); iconv_close(conv); if (pdest != NULL)
free(pdest); return 0;
}

上面的代码,将正在安装UTF-8转成gb2312编码格式。Note:文件保存的时候,一定要用UTF-8模式保存。

参考:


1、Fucntion iconv()

2、HP iconv

GNU iconv的更多相关文章

  1. conky 配置变量表

    转自conky 配置变量表 项目主页:http://conky.sourceforge.net/ 文档说明:http://conky.sourceforge.net/docs.html Variabl ...

  2. CentOS7.5安装配置conky(极简)

    1.安装epel源 下载地址:http://dl.fedoraproject.org/pub/epel/ 找到epel-release-XXXXXXX.rpm文件,下载解压 rpm -ivh epel ...

  3. Linux 《conky配置说明书》

    名称 conky - 最初基于躯干代码的X系统监视器,但更多的kickass.它只是继续给予它.是啊. 概要 conky [ options ] 描述 Conky是最初基于torsmo的X系统监视器. ...

  4. OpenWRT 编译 error GNU libiconv not in use but included iconv.h is from...

    OpenWRT 编译 error GNU libiconv not in use but included iconv.h is from... 编译的时候碰到一个常见的错误,但是却在一个陌生的地方爆 ...

  5. ARM开发板上iconv调用失败的解决方法

    当前流行的字符编码格式有:US-ASCII.ISO-8859-1.UTF-8.UTF-16BE.UTF-16LE.UTF-16.GBK.GB2312等,其中GBK.GB2312是专门处理中文编码的.而 ...

  6. Linux下安装libiconv使php支持iconv函数

    libiconv组件安装好了可以让我们php支持iconv函数了,这个函数的作用就是字符编码强制转换了,下面和111cn小编一起来看一个Linux中安装libiconv使php支持iconv函数的例子 ...

  7. 【转载】php中iconv函数使用方法

    原文:http://www.phpweblog.net/star65225692/archive/2011/03/23/7524.html     在选择用什么工具开发,唯一的指导标准就是:用最少的人 ...

  8. php中iconv函数使用方法

    最近在做一个程序,需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些. iconv函数库能够完成各种字符集 ...

  9. iconv字符编码转换

    转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/li ...

随机推荐

  1. EASYUI- EASYUI左移右移 GRID中值

    EASYUI左移右移 GRID中值 $("#addAll").click(function(){ var ids = []; var names = []; var srcrows ...

  2. linux教程:[4]配置Tomcat开机启动

    http://jingyan.baidu.com/article/6525d4b1382f0aac7d2e9421.html 方法/步骤 1 请自行下载安装配置tomcat的服务器环境 本经验仅仅介绍 ...

  3. cocos2d-x中本地推送消息

    作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4038277.html  IOS下很简单: 添加一条推送 void PushNotific ...

  4. 【转】来自《轻松scrum之旅》的敏捷开发总结

    敏捷开发的核心价值观是,软件开发最重要的是给用户提供有价值的.可以工作的软件.如何保证提供有价值的软件,是通过反馈机制来完成的.这一点,我们体会很深.自从采用敏捷开发以后,我们比以前更有意识地希望得到 ...

  5. MVC返回http状态码

    //controller ); //asp.net return HttpStatusCode.OK

  6. 计算机思维or人的思维

    计算机领域就会有计算机领域的一些特性和一些思维方式,或者说有他自己的一些问题,须要用相应的思维方式来进行理解它,从而更好的驾驭他.有些时候遇到的一些问题,自己想却想不明确,也是由于我们没有把自己当做一 ...

  7. Tomcat部署web应用的三种方式

    原文:http://my.oschina.net/sunchp/blog/90235 一:相关概念 CATALINA_HOME:tomcat安装目录 CATALINA_BASE:tomcat工作目录 ...

  8. Overview & Change Log

    Overview & Change Log Nova Framework is a PHP 5.5+ MVC Framework. It's designed to be lightweigh ...

  9. MySQL(1):启动MySQL服务,客户端连接服务

    1.安装完毕mysql之后,在windows中找到服务,启动MySQL服务(服务端)(mysqld.exe) 2.接下来启动客户端(mysql.exe) 这里参数中: -hlocalhost 表示主机 ...

  10. Android界面刷新

    Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于: 1)invalidate():实例化一个Handler对象,并重写handleMessage方法调 ...