有许多人在做项目的时候都会遇到字符编码的不一致导致的乱码问题,那如何去解决呢?在Linux系统上可以通过iconv函数族来进行编码转换,可是关键的问题是,用iconv编写的转换程序在x86的主机上运行的好好的可是一旦移植到ARM板上就不行了。为了解决这个问题,我决定亲自编译一个iconv的ARM版本,然后用自己编译出来的iconv库而不用主机系统的函数库。首先下载iconv库的压缩包可以下下面的网址去下载:http://download.youkuaiyun.com/detail/yanchen0314/7556359
首先我们先讲解iconv库的编译过程,其实编译的过程很简单不过编译中会遇到一个错误稍后将会说明它的解决办法。第一步,当然是先解压iconv库的压缩包,解压完后进入该目录。第二步,配置编译选项,在终端输入命令:
sudo ./configure CC=/home/arm-linux/arm-2013.05/bin/arm-none-linux-gnueabi-gcc--build=i686-pc-linux --target=arm-linux --host=arm-none-linux-gnueabi--prefix=/home/libicnov/libiconv_arm --enable-shared --enable-static
逐一解释以下各项的意义,” CC=/home/arm-linux/arm-2013.05/bin/arm-none-linux-gnueabi-gcc”,指的是你所使用的编译器,我们这里选用arm的交叉编译工具。“--build=i686-pc-linux”,指的是你的编译主机的环境(不是很重要);“--target=arm-linux”,指的是你目标机的环境(不是很重要);“--prefix=/home/libicnov/libiconv_arm”,指的是你准备安装的目录;“--enable-shared”,指的是需要编译动态链接库;“--enable-static”指的是需要编译静态链接库。执行完之后会生成Makefile文件。第二步,编译,在终端输入make执行编译指令,这个时候编译很有可能通不过,编译器报错:“./stdio.h:1010:1: error: 'gets' undeclared here (not in a function)”。找了很久,结果找到了一个补丁(下载地址:http://www.itkb.ro/userfiles/file/libiconv-glibc-2.16.patch.gz
)我们来分析这个补丁,下面是一部分补丁的代码:
--- srclib/stdio.in.h.orig 2011-08-07 16:42:06.000000000 +0300
+++ srclib/stdio.in.h 2013-01-10 15:53:03.000000000 +0200
@@ -695,7 +695,9 @@
/* It is very rare that the developer ever has full control of stdin,
so any use of gets warrants an unconditional warning. Assume it is
always declared, since it is required by C89. */
-_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
+ _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+#endif
#endif
看明白了嘛?意思就是修改srclib/stdio.in.h的第695行,去掉“_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");”加上if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif
然后在执行make就可以了。第三步,执行make insatll进行安装就结束了。看一看你的安装目录的lib目录下有没有libiconv.a 和libiconv.so的链接库。
至于iconv的使用,网上大把的资料我就不赘述了。