Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329503
  • 博文数量: 57
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 769
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-29 14:57
文章分类
文章存档

2014年(39)

2013年(13)

2012年(5)

我的朋友

分类: 嵌入式

2012-10-18 08:59:59

裁剪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.*/
  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.*/
  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.*/
  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.*/
  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.*/
  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源代码包。

裁剪过后源代码包在这个帖子里面可以下载:
阅读(2441) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:tmpfs简介

给主人留下些什么吧!~~