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. MySQL主从复制技术(纯干货)

    1.复制配置     主机一定要开启二进制日志(这里建议配置RBR)     每个主机和每个从机一定要配置一个位移的id,即server-id     每个从机配置一定要包含主机名称,日志名称,和位置 ...

  2. 【52】写了placement new也要写placement delete

    1.Widget* pw = new Widget; 调用了两个方法:第一个方法是operator new 负责分配内存:第二个方法是在分配的内存上构造Widget,即调用Widget的default ...

  3. android 处理网络状态——无网,2g,3g,wifi,ethernet,other

    今天在一位很牛逼的学长的博客里面看到了这段代码后,很是激动啊,于是就“偷”了过来,嘿嘿....为自己也为更多需要它的程序媛 直接上代码: public class GetNetWorkStateAct ...

  4. git codes

    https://github.com/chibi-guts/DressUpProject https://github.com/TuttiFruttiFT/TFAndroid https://gith ...

  5. kernel debuging

    http://blog.csdn.net/XscKernel/article/category/1276234

  6. Tomcat配置域名访问

    在server.xml文件中的<Host>标签里面添加 <Alias>你的域名(比如:www.baidu.com)</Alias> <Context path ...

  7. visual studio 2013 有效序列号

    还没试过,可以参考下! visual studio 2013 有效序列号: BWG7X-J98B3-W34RT-33B3R-JVYW9

  8. Linux 学习笔记 基本的bash shell命令

    Linux 文件系统 Linux讲文件存储在单个目录结构(虚拟目录)中,虚拟目录包含了安装在PC上的所有存储设备的文件路径. Linux虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备.Linu ...

  9. 【大坑】DataGridView多线程更新修改Cell单元格卡死

    最新发现是Column的AutoSizeMode设置为AllCell调整宽度而造成的卡顿,还有就是在现在里面使用Invoke用匿名函数闭包的形式访问For循环的i变量值会不正确导致找不到索引而造成卡顿 ...

  10. 在IOS中 NSRange类详解

    NSRange的定义 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSRange是一个结构 ...