libiconv库裁剪

libiconv简介

国际文本大多以Unicode编码 。但是,由于历史原因,它有时仍使用语言或国家/地区相关的字符编码进行编码。随着互联网的出现以及各国之间频繁的文本交换 - 即使从外国查看网页也是这种情况下的“文本交换” - 这些编码之间的转换已成为必需。

特别是,具有Windows操作系统的计算机仍然使用传统(有限)字符编码在区域设置中运行。某些程序(如邮件程序和Web浏览器)必须能够在给定的文本编码和用户的编码之间进行转换。其他程序在内部以Unicode格式存储字符串,以便于内部处理,并且在进行I / O时需要在内部字符串表示(Unicode)和外部字符串表示(传统编码)之间进行转换。GNU libiconv是两种应用程序的转换库。

libiconv裁剪

1.libiconv下载

libiconv源码下载地址:
http://ftp.gnu.org/pub/gnu/libiconv/
https://mirror.bjtu.edu.cn/gnu/libiconv/
我下载的版本是:libiconv-1.11.tar.gz

2.libiconv解压

以libiconv-1.11.tar.gz压缩包为例,解压:

tar -zxvf libiconv-1.11.tar.gz

进入libiconv-1.11目录:

cd libiconv-1.11

3.修改源文件

需要修改的文件只有两个,都在lib目录下,一个为aliases.gperf,另一个为encodings.def。

首先打开aliases.gperf,自上到下,直到CSISOLATIN1, ei_iso8859_1这一行,这些是需要保留的,然后剩下的就可以自由裁减了。

由于我只需要GB2312和GBK,所以后面的部分我只保留了下面几行:

EUC-CN, ei_euc_cn
EUCCN, ei_euc_cn
GB2312, ei_euc_cn
CN-GB, ei_euc_cn
CSGB2312, ei_euc_cn
GBK, ei_ces_gbk

其他的行全部删掉了,然后保存,修改后的aliases.gperf文件如下所示:

struct alias { int name; unsigned int encoding_index; };
%struct-type
%language=ANSI-C
%define hash-function-name aliases_hash
%define lookup-function-name aliases_lookup
%7bit
%readonly-tables
%global-table
%define word-array-name aliases
%pic
%%
US-ASCII, ei_ascii
ASCII, ei_ascii
ISO646-US, ei_ascii
ISO_646.IRV:1991, ei_ascii
ISO-IR-6, ei_ascii
ANSI_X3.4-1968, ei_ascii
ANSI_X3.4-1986, ei_ascii
CP367, ei_ascii
IBM367, ei_ascii
US, ei_ascii
CSASCII, ei_ascii
UTF-8, ei_utf8
UCS-2, ei_ucs2
ISO-10646-UCS-2, ei_ucs2
CSUNICODE, ei_ucs2
UCS-2BE, ei_ucs2be
UNICODEBIG, ei_ucs2be
UNICODE-1-1, ei_ucs2be
CSUNICODE11, ei_ucs2be
UCS-2LE, ei_ucs2le
UNICODELITTLE, ei_ucs2le
UCS-4, ei_ucs4
ISO-10646-UCS-4, ei_ucs4
CSUCS4, ei_ucs4
UCS-4BE, ei_ucs4be
UCS-4LE, ei_ucs4le
UTF-16, ei_utf16
UTF-16BE, ei_utf16be
UTF-16LE, ei_utf16le
UTF-32, ei_utf32
UTF-32BE, ei_utf32be
UTF-32LE, ei_utf32le
UTF-7, ei_utf7
UNICODE-1-1-UTF-7, ei_utf7
CSUNICODE11UTF7, ei_utf7
UCS-2-INTERNAL, ei_ucs2internal
UCS-2-SWAPPED, ei_ucs2swapped
UCS-4-INTERNAL, ei_ucs4internal
UCS-4-SWAPPED, ei_ucs4swapped
C99, ei_c99
JAVA, ei_java
ISO-8859-1, ei_iso8859_1
ISO_8859-1, ei_iso8859_1
ISO_8859-1:1987, ei_iso8859_1
ISO-IR-100, ei_iso8859_1
CP819, ei_iso8859_1
IBM819, ei_iso8859_1
LATIN1, ei_iso8859_1
L1, ei_iso8859_1
CSISOLATIN1, ei_iso8859_1
EUC-CN, ei_euc_cn
EUCCN, ei_euc_cn
GB2312, ei_euc_cn
CN-GB, ei_euc_cn
CSGB2312, ei_euc_cn
GBK, ei_ces_gbk

下面修改encodings.def,这个根据刚才修改的aliases.gperf来修改。自上而下,直到

DEFENCODING(( "ISO-8859-1",             /* IANA */
              "ISO_8859-1",             /* IANA */
              "ISO_8859-1:1987",        /* IANA */
              "ISO-IR-100",             /* IANA */
              "CP819",                  /* IANA */
              "IBM819",                 /* IANA */
              "LATIN1",                 /* IANA */
              "L1",                     /* IANA */
              "csISOLatin1",            /* IANA */
            /*"ISO8859-1",                 X11R6.4, glibc */
            /*"ISO8859_1",                 JDK 1.1 */
            ),
            iso8859_1,
            { iso8859_1_mbtowc, NULL },   { iso8859_1_wctomb, NULL })

这一部分,上面所有的是需要保留的(包括这一部分)。后面再保留:

DEFENCODING(( "GB_2312-80",             /* IANA */
              "ISO-IR-58",              /* IANA */
              "csISO58GB231280",        /* IANA */
              "CHINESE",                /* IANA */
            /*"GB2312.1980-0",             X11R6.4 */
            ),
            gb2312,
            { gb2312_mbtowc, NULL },      { gb2312_wctomb, NULL })

DEFENCODING(( "EUC-CN",                 /* glibc */
              "EUCCN",                  /* glibc */
              "GB2312",                 /* IANA */
              "CN-GB",                  /* RFC 1922 */
              "csGB2312",               /* IANA */
            /*"EUC_CN",                    JDK 1.1 */
            /*"CP51936",                   Windows */
            ),
            euc_cn,
            { euc_cn_mbtowc, NULL },      { euc_cn_wctomb, NULL })

DEFENCODING(( "GBK",                    /* IANA, JDK 1.1 */
            ),
            ces_gbk,
            { ces_gbk_mbtowc, NULL },     { ces_gbk_wctomb, NULL })

这个是关于GB2312和GBK编码的。剩余的部分可以全部删除了,这与aliases.gperf对应起来了。

4.由aliases.gperf重新生成aliases.h

aliases.gperf文件的目的是为了生成aliases.h。打开aliases.h,发现前面几行有些注释:

/* ANSI-C code produced by gperf version 3.0.3 */
/* Command-line: gperf -t -L ANSI-C -H aliases_hash -N aliases_lookup -G -W aliases -7 -C -k '1,3-11,$' -i 1 aliases.gperf  */

看到了生成aliases.h的命令行,于是在lib目录下,执行:

gperf -t -L ANSI-C -H aliases_hash -N aliases_lookup -G -W aliases -7 -C -k '1,3-11,$' -i 1 aliases.gperf > aliases.h

便可以了。
注意:若系统未安装gperf,有root权限直接安装gperf即可,没有root权限,可将gperf安装到本地,添加安装路径到本用户环境变量再执行即可

我的示例:

/data1/mayue6/opt/gperf-3.1/bin/gperf -t -L ANSI-C -H aliases_hash -N aliases_lookup -G -W aliases -7 -C -k '1,3-11,$' -i 1 aliases.gperf > aliases.h

5.配置,编译

进入libiconv-1.11的根目录,执行

./configure --prefix=/data1/mayue6/opt/lib/libiconv-1.11 CC=/data1/mayue6/opt/arm-fullhan-linux-toolchain/toolchain/arm-fullhan-linux-uclibcgnueabi/bin/arm-fullhan-linux-uclibcgnueabi-gcc --target=arm-fullhan-linux-uclibcgnueabi --host=arm-fullhan-linux-uclibcgnueabi --enable-shared=yes --enable-static=yes

–prefix= 配置安装路径
CC= 配置编译工具链(使用绝对路径)
–target=
–host=
–enable-shared=yes 为了生成动态库
–enable-static=yes 为了生成静态库libiconv.a

配置成功后,执行

make
make install

最后到配置目录/data1/mayue6/opt/lib/libiconv-1.11/lib下查看生成静态库libiconv.a

没有精简之前,生成的libiconv.a有1.1M,精简后只有334K

对比如下图:
在这里插入图片描述

参考资料
https://blog.csdn.net/hubinbin595959/article/details/84437985

发布了60 篇原创文章 · 获赞 43 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/mayue_web/article/details/100108034