Libiconv裁剪

裁剪libiconv
项目里面只需要UTF8与GB2312的转换。
1.下载源代码编译,编写测试代码,gdb调试,查看UTF8和GB2312转换调用的函数,分别是xxx_wctomb和xxx_mbtowc(文件就是utf8.h/euc_cn.h),aliases.gperf文件里面有定义UTF-8, ei_utf8和GB2312, ei_euc_cn。
2.encoding.def文件进行修改,最后只剩下:
  1. DEFENCODING(( "US-ASCII",               /* IANA */
  2.               "ASCII",                  /* IANA, JDK 1.1 */
  3.               "ISO646-US",              /* IANA */
  4.               "ISO_646.IRV:1991",       /* IANA */
  5.               "ISO-IR-6",               /* IANA */
  6.               "ANSI_X3.4-1968",         /* IANA */
  7.               "ANSI_X3.4-1986",         /* IANA */
  8.               "CP367",                  /* IANA */
  9.               "IBM367",                 /* IANA */
  10.               "US",                     /* IANA */
  11.               "csASCII",                /* IANA */
  12.             /*"ISO646.1991-IRV",           X11R6.4 */
  13.             ),
  14.             ascii,
  15.             { ascii_mbtowc, NULL },       { ascii_wctomb, NULL })

  16. /* General multi-byte encodings */

  17. DEFENCODING(( "UTF-8",                  /* IANA, RFC 2279 */
  18.             /*"UTF8",                      JDK 1.1 */
  19.             /*"CP65001",                   Windows */
  20.             ),
  21.             utf8,
  22.             { utf8_mbtowc, NULL },        { utf8_wctomb, NULL })


  23. DEFENCODING(( "GB_2312-80",             /* IANA */
  24.               "ISO-IR-58",              /* IANA */
  25.               "csISO58GB231280",        /* IANA */
  26.               "CHINESE",                /* IANA */
  27.             /*"GB2312.1980-0",             X11R6.4 */
  28.             ),
  29.             gb2312,
  30.             { gb2312_mbtowc, NULL },      { gb2312_wctomb, NULL })

  31. DEFENCODING(( "EUC-CN",                 /* glibc */
  32.               "EUCCN",                  /* glibc, IRIX */
  33.               "GB2312",                 /* IANA */
  34.               "CN-GB",                  /* RFC 1922 */
  35.               "csGB2312",               /* IANA */
  36.             /*"EUC_CN",                    JDK 1.1 */
  37.             /*"CP51936",                   Windows */
  38.             ),
  39.             euc_cn,
  40.             { euc_cn_mbtowc, NULL },      { euc_cn_wctomb, NULL })
复制代码
3.然后对aliases.h进行修改,删除没有用的编码。
  1. struct stringpool_t
  2.   {
  3.     char stringpool_str117[sizeof("CHINESE")];
  4.     char stringpool_str120[sizeof("ASCII")];
  5.     char stringpool_str165[sizeof("GB2312")];
  6.     char stringpool_str255[sizeof("UTF-8")];
  7.   };
  8. static const struct stringpool_t stringpool_contents =
  9.   {
  10.     "CHINESE",
  11.     "ASCII",
  12.     "GB2312",
  13.     "UTF-8",
  14.   };
  15. /* 与上面的struct stringpool_t对应起来 */
  16. static const struct alias aliases[] =
  17.   {
  18. #line 14 "lib/aliases.gperf" /* 与gperf文件中的行号对应起来*/
  19.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_gb2312},
  20. #line 12 "lib/aliases.gperf"
  21.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_ascii},
  22. #line 15 "lib/aliases.gperf"
  23.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_euc_cn},
  24. #line 13 "lib/aliases.gperf"
  25.     {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_utf8},
  26.   };

  27. /*修改为只支持UTF8和GB2312,不用在查找,可以删除多余的代码*/
  28. const struct alias *
  29. aliases_lookup (register const char *str, register unsigned int len)
  30. {
  31.   if (!strcmp(str, "UTF-8"))
  32.     return &aliases[3];
  33.   else if (!strcmp(str, "GB2312"))
  34.     return &aliases[2];
  35.   return 0;
  36. }
复制代码
4.修改aliases. gperf,删除大部分编码,只剩下你需要的编码类型。
  1. struct alias { int name; unsigned int encoding_index; };
  2. %struct-type
  3. %language=ANSI-C
  4. %define hash-function-name aliases_hash
  5. %define lookup-function-name aliases_lookup
  6. %7bit
  7. %readonly-tables
  8. %global-table
  9. %define word-array-name aliases
  10. %pic
  11. %%
  12. ASCII, ei_ascii
  13. UTF-8, ei_utf8
  14. CHINESE, ei_gb2312
  15. GB2312, ei_euc_cn
复制代码
5.然后再make,会有几个文件报错(canonical.h等),对报错的地方进行屏蔽,具体看上传已裁减的libiconv源代码包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值