本文摘自:http://my.huhoo.net/archives/2012/10/gbkutf8.html
非常感谢原文作者。
具体需求是这样,嵌入式环境,sh架构的,厂商提供的SDK中的iconv库不够全,不支持gb2312,也不支持gbk,导致我在实现utf-8转gb2312编码时不能通过标准iconv库完成。
最终找到两个解决办法。
1. 使用网上流传比较广泛的preload技术,从gnu网站上download来libiconv源代码,然后交叉编译,得到preload_libiconv.so,然后在板子启动时就加入export LD_PRELOAD=XXX,XXX是preload_libiconv.so文件的绝对路径,那么其他程序调用iconv库中的函数时,系统就会去LD_PRELOAD指定的so文件中去查询对应的函数,如果找不到才会去glibc.so中查找,这样就巧妙的相当于更新了glibc.so。
顺便提一下交叉编译方式:
./configure --prefix=$PWD/out --host=sh4-linux CC=/opt/STM/STLinux-2.4/devkit/sh4/bin/sh4-linux-gcc
--host指定的是运行二进制程序的设备的架构和操作系统,其实就是开发板的。
所以这里填写的就是sh4(开发板的CPU架构)-linux(开发板使用的操作系统)
CC指定厂商提供的SDK中编译链的绝对路径,大部分情况下就是xxx-xxx-gcc了,
所以这里也是
sh4(开发板的CPU架构)-linux(开发板使用的操作系统)-gcc(gcc编译套件,当然也有可能是g++)
2. 第一种方法不是很好,所以我继续找方法,终于找到了那位作者自己实现的gbk和utf-8之间互转的C语言函数。
因为gbk是兼容gb2312的,所以我之前一直纠结于去搜索关键词 utf-8 to gb2312 in C,导致没找到合适的参考。
大多数情况下,你不用会所有的东西,因为咱们都是站在巨人的肩膀上,但是基础越扎实越好。