GNU iconv
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模式保存。
参考:
GNU iconv的更多相关文章
- conky 配置变量表
转自conky 配置变量表 项目主页:http://conky.sourceforge.net/ 文档说明:http://conky.sourceforge.net/docs.html Variabl ...
- CentOS7.5安装配置conky(极简)
1.安装epel源 下载地址:http://dl.fedoraproject.org/pub/epel/ 找到epel-release-XXXXXXX.rpm文件,下载解压 rpm -ivh epel ...
- Linux 《conky配置说明书》
名称 conky - 最初基于躯干代码的X系统监视器,但更多的kickass.它只是继续给予它.是啊. 概要 conky [ options ] 描述 Conky是最初基于torsmo的X系统监视器. ...
- 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... 编译的时候碰到一个常见的错误,但是却在一个陌生的地方爆 ...
- ARM开发板上iconv调用失败的解决方法
当前流行的字符编码格式有:US-ASCII.ISO-8859-1.UTF-8.UTF-16BE.UTF-16LE.UTF-16.GBK.GB2312等,其中GBK.GB2312是专门处理中文编码的.而 ...
- Linux下安装libiconv使php支持iconv函数
libiconv组件安装好了可以让我们php支持iconv函数了,这个函数的作用就是字符编码强制转换了,下面和111cn小编一起来看一个Linux中安装libiconv使php支持iconv函数的例子 ...
- 【转载】php中iconv函数使用方法
原文:http://www.phpweblog.net/star65225692/archive/2011/03/23/7524.html 在选择用什么工具开发,唯一的指导标准就是:用最少的人 ...
- php中iconv函数使用方法
最近在做一个程序,需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些. iconv函数库能够完成各种字符集 ...
- iconv字符编码转换
转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/li ...
随机推荐
- mysql数据库全局只读和会话只读问题解析
对于系统的发布是经常有的事情,有些时候需要隔绝外界对数据库的更改但是还要求可以读取数据,对于mss sql 这个就是很简单,直接属性—>选项—>只读 ,但是对于mysql这是不同的,今天仔 ...
- Sublime Text 2&3中输入法不跟随光标移动的问题的解决方法
插件名称:IMESupport GitHub页面:https://github.com/chikatoike/IMESupport 安装方法: 手动安装和通过Package Control在线安装. ...
- 数据库升级ora-04063 DBMS_REGISTRY has error
在做Oracle数据库从11.2.0.1.0升级到11.2.0.2.8时,软件升级没有问题,实例升级没有问题,升级psu的时候. 执行@?/rdbms/admin/catbundle psu appl ...
- android学习日记15--WebView(网络视图)
一.WebView 1.简述 WebView(网络视图)内置WebKit引擎,能加载显示网页,还支持JS,并且能够在Android平台使用AJAXWebView可以在布局中声明,也可以在Activit ...
- VBScript
VBScript then PrintWMIErrorthenExit Err.Description, Err.Number else ifnot boolCathiMode then wscrip ...
- 文件和目录之umask函数
本篇博文内容摘自<UNIX环境高级编程>(第二版),仅作个人学习记录所用.关于本书可参考:http://www.apuebook.com/. umask函数为进程设置文件模式创建屏蔽字,并 ...
- (收藏)sokcet编程
C# Socket网络编程精华篇 C#编写高性能网络服务器(源码) .net自动更新组件Ant 客户端服务器通信demo(附源码) 有了WCF,Socket是否已人老珠黄? Socket服务器整体架构 ...
- IIS 之 失败请求跟踪规则
若想使用此功能需先启动如下图的Windows功能: 利用失败请求跟踪功能,可以在出现问题时捕获相应的XML格式的日志,从而无需重现该问题即可开始故障排除.此外,还可以定义应用程序的失败条件并配置要基于 ...
- Android中的事件分发机制总结
Android 的事件分发机制 一.View的事件分发总结: View的onTouchEvent和OnTouch区别 还是以自定义的TestButton为例. 我们可以通过重写onTouchEven ...
- Android(java)学习笔记133:ListViewProject案例(ListView + BaseAdapter + CheckBox)
这个案例可能稍微复杂一点,我会讲述详细一点: 1.首先是AndroidManifest.xml: <?xml version="1.0" encoding="utf ...