libiconv用于将任意编码方式的字符转换为另一编码方式,由于libiconv库中存在大量我们用不上的字库,因此可以对其进行裁剪。
在libiconv源码下的lib/encodings.def
对其支持的所有编码方式进行了定义,此外还有其他几个def
后缀的文件,如encodings_extra.def
,encodings_dos.def
等,这些默认是没有启用的,在裁剪的时候一般无需理会,只需修改encodings.def
即可。
你可以直接删除encodings.def
中定义的DEFENCODING
,或者用条件编译、注释等方法将其屏蔽。
以下patch适用于libiconv-1.16,删除了日文、韩文、big5以及ISO8859-2后的所有字库,保留了gb2312/gbk/gb18030字库:
--- a/lib/encodings.def
+++ b/lib/encodings.def
@@ -168,6 +168,8 @@ DEFENCODING(( "UCS-4-SWAPPED", /* libiconv */
ucs4swapped,
{ ucs4swapped_mbtowc, NULL }, { ucs4swapped_wctomb, NULL })
+# if 0
+
DEFENCODING(( "C99",
),
c99,
@@ -178,6 +180,8 @@ DEFENCODING(( "JAVA",
java,
{ java_mbtowc, NULL }, { java_wctomb, NULL })
+#endif //if 0
+
/* Standard 8-bit encodings */
DEFENCODING(( "ISO-8859-1", /* IANA */
@@ -218,6 +222,8 @@ DEFALIAS( "ISO88592", /* HP-UX */
iso8859_2)
#endif
+#if 0
+
DEFENCODING(( "ISO-8859-3", /* IANA */
"ISO_8859-3", /* IANA */
"ISO_8859-3:1988", /* IANA */
@@ -429,6 +435,8 @@ DEFENCODING(( "KOI8-RU",
koi8_ru,
{ koi8_ru_mbtowc, NULL }, { koi8_ru_wctomb, NULL })
+#endif //if 0
+
/* Windows 8-bit encodings */
DEFENCODING(( "CP1250", /* JDK 1.1 */
@@ -460,6 +468,8 @@ DEFALIAS( "IBM-1252", /* AIX */
cp1252)
#endif
+#if 0
+
DEFENCODING(( "CP1253", /* JDK 1.1 */
"WINDOWS-1253", /* IANA */
"MS-GREEK",
@@ -501,6 +511,8 @@ DEFENCODING(( "CP1258", /* JDK 1.1 */
cp1258,
{ cp1258_mbtowc, cp1258_flushwc }, { cp1258_wctomb, NULL })
+#endif //if 0
+
/* DOS 8-bit encodings */
DEFENCODING(( "CP850", /* IANA, JDK 1.1 */
@@ -515,6 +527,8 @@ DEFALIAS( "IBM-850", /* AIX */
cp850)
#endif
+#if 0
+
DEFENCODING(( "CP862", /* IANA, JDK 1.1 */
"IBM862", /* IANA */
"862", /* IANA */
@@ -523,6 +537,8 @@ DEFENCODING(( "CP862", /* IANA, JDK 1.1 */
cp862,
{ cp862_mbtowc, NULL }, { cp862_wctomb, NULL })
+#endif //if 0
+
DEFENCODING(( "CP866", /* IANA, JDK 1.1 */
"IBM866", /* IANA */
"866", /* IANA */
@@ -531,6 +547,8 @@ DEFENCODING(( "CP866", /* IANA, JDK 1.1 */
cp866,
{ cp866_mbtowc, NULL }, { cp866_wctomb, NULL })
+#if 0
+
DEFENCODING(( "CP1131", /* FreeBSD, MacOS X */
),
cp1131,
@@ -772,6 +790,8 @@ DEFENCODING(( "JIS_X0212",
jisx0212,
{ jisx0212_mbtowc, NULL }, { jisx0212_wctomb, NULL })
+#endif //if 0
+
DEFENCODING(( "GB_1988-80", /* IANA */
"ISO646-CN", /* IANA */
"ISO-IR-57", /* IANA */
@@ -790,6 +810,8 @@ DEFENCODING(( "GB_2312-80", /* IANA */
gb2312,
{ gb2312_mbtowc, NULL }, { gb2312_wctomb, NULL })
+#if 0
+
DEFENCODING(( "ISO-IR-165",
"CN-GB-ISOIR165", /* RFC 1922 */
),
@@ -810,6 +832,7 @@ DEFENCODING(( "KSC_5601", /* IANA */
/* CJK encodings */
+
DEFENCODING(( "EUC-JP", /* IANA */
"EUCJP", /* glibc, HP-UX, IRIX, OSF/1, Solaris */
"Extended_UNIX_Code_Packed_Format_for_Japanese", /* IANA */
@@ -875,6 +898,8 @@ DEFENCODING(( "ISO-2022-JP-MS",
iso2022_jpms,
{ iso2022_jpms_mbtowc, NULL }, { iso2022_jpms_wctomb, iso2022_jpms_reset })
+#endif //if 0
+
DEFENCODING(( "EUC-CN", /* glibc */
"EUCCN", /* glibc, IRIX */
"GB2312", /* IANA */
@@ -916,6 +941,8 @@ DEFENCODING(( "GB18030", /* IANA, glibc */
gb18030,
{ gb18030_mbtowc, NULL }, { gb18030_wctomb, NULL })
+#if 0
+
DEFENCODING(( "ISO-2022-CN", /* IANA, RFC 1922 */
"csISO2022CN",
/*"ISO2022CN", JDK 1.1 */
@@ -1038,3 +1065,4 @@ DEFENCODING(( "ISO-2022-KR", /* IANA, RFC 1557 */
iso2022_kr,
{ iso2022_kr_mbtowc, NULL }, { iso2022_kr_wctomb, iso2022_kr_reset })
+#endif //if 0
修改好encodings.def
后,借助libiconv自带的Makefile重新生成aliases.h
和flags.h
以下操作需要gperf,如果是Debian系的Linux可以用apt install gperf
安装gperf
make -B -f Makefile.devel lib/aliases.h lib/flags.h
如果你修改了encodings_dos.def
或其他def文件,那么还需要重新生成aliases_dos.h
:
make -B -f Makefile.devel lib/aliases_dos.h
上述操作如果没有报错的话,就可以重新configure
并编译了:
./configure
make clean
make -j4
最后脱去不需要的调试符号,并对比裁剪之前的体积:
strip -g --strip-unneeded libiconv.so.2.6.1 -o strip-libiconv.so.2.6.1
库名称 | 未裁剪 | 仅删除日文与韩文 | 删除日文、韩文与big5等 |
---|---|---|---|
strip-libiconv.so.2.6.1 | 916k | 752k | 254k |