iconv.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /**************************************************************************
  2. * Copyright (C), AirM2M Tech. Co., Ltd.
  3. *
  4. * Name: iconv.c
  5. * Author: liweiqiang
  6. * Version: V0.1
  7. * Date: 2013/7/15
  8. *
  9. * Description:
  10. * 字符编码转换
  11. **************************************************************************/
  12. /*
  13. @module iconv
  14. @summary 字符编码转换
  15. @version V0.1
  16. @data 2021年12月13日
  17. */
  18. #include <string.h>
  19. #include "iconv.h"
  20. #include "prv_iconv.h"
  21. typedef struct builtin_iconv_map_tag
  22. {
  23. const char *from;
  24. const char *to;
  25. const iconv_fct fct;
  26. }builtin_iconv_map;
  27. static const builtin_iconv_map iconv_map[] =
  28. {
  29. {"ucs2", "gb2312", iconv_ucs2_to_gb2312},
  30. /*+\NEW\liweiqiang\2013.11.26\完善gb2312<->ucs2(ucs2be)编码转换*/
  31. {"ucs2be", "gb2312", iconv_ucs2be_to_gb2312},
  32. {"gb2312", "ucs2", iconv_gb2312_to_ucs2},
  33. {"gb2312", "ucs2be", iconv_gb2312_to_ucs2be},
  34. /*-\NEW\liweiqiang\2013.11.26\完善gb2312<->ucs2(ucs2be)编码转换*/
  35. /*+\NEW\liweiqiang\2013.7.19\增加utf8<->ucs2,ucs2be编码转换*/
  36. {"utf8", "ucs2", iconv_utf8_to_ucs2},
  37. {"utf8", "ucs2be", iconv_utf8_to_ucs2be},
  38. {"ucs2", "utf8", iconv_ucs2_to_utf8},
  39. {"ucs2be", "utf8", iconv_ucs2be_to_utf8},
  40. /*-\NEW\liweiqiang\2013.7.19\增加utf8<->ucs2,ucs2be编码转换*/
  41. };
  42. /*
  43. 打开相应字符编码转换函数
  44. @function iconv.open(tocode, fromcode)
  45. @string tocode$目标编码格式$gb2312/ucs2/ucs2be/utf8
  46. @string fromcode$源编码格式$gb2312/ucs2/ucs2be/utf8
  47. @return table$cd$编码转换函数的转换句柄$
  48. @usage
  49. --unicode大端编码 转化为 utf8编码
  50. local cd = iconv.open("utf8", "ucs2be")
  51. */
  52. iconv_t iconv_open (const char * to_code, const char * from_code)
  53. {
  54. size_t i;
  55. for(i = 0; i < sizeof(iconv_map)/sizeof(iconv_map[0]); i++)
  56. {
  57. if(strcmp(iconv_map[i].from, from_code) == 0 &&
  58. strcmp(iconv_map[i].to, to_code) == 0)
  59. {
  60. return (iconv_t)&iconv_map[i];
  61. }
  62. }
  63. return (iconv_t)-1;
  64. }
  65. /*
  66. 字符编码转换
  67. @function cd:iconv(inbuf)
  68. @string inbuf$输入字符串$例如:ucs2s
  69. @return number$result$返回编码转换后的结果$0成功,-1失败
  70. @usage
  71. --unicode大端编码 转化为 utf8编码
  72. function ucs2beToUtf8(ucs2s)
  73. local cd = iconv.open("utf8", "ucs2be")
  74. return cd:iconv(ucs2s)
  75. end
  76. */
  77. size_t iconv_convert (iconv_t __cd, char ** __inbuf, size_t * __inbytesleft, char ** __outbuf, size_t * __outbytesleft)
  78. {
  79. builtin_iconv_map *_map_cd = (builtin_iconv_map *)__cd;
  80. if(__inbuf == NULL || *__inbuf == NULL)
  81. return (size_t)-1;
  82. if(_map_cd < &iconv_map[0] &&
  83. _map_cd > &iconv_map[sizeof(iconv_map)/sizeof(iconv_map[0])])
  84. return (size_t)-1;
  85. return _map_cd->fct(__inbuf, __inbytesleft, __outbuf, __outbytesleft);
  86. }
  87. /*
  88. 关闭字符编码转换
  89. @function iconv.close(cd)
  90. @string cd$iconv.open返回的句柄$
  91. @return
  92. @usage
  93. --关闭字符编码转换
  94. local cd = iconv.open("utf8", "ucs2be")
  95. iconv.close(cd)
  96. */
  97. int iconv_close (iconv_t cd)
  98. {
  99. return 0;
  100. }