iconv.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. #include <string.h>
  13. #include "iconv.h"
  14. #include "prv_iconv.h"
  15. typedef struct builtin_iconv_map_tag
  16. {
  17. const char *from;
  18. const char *to;
  19. const iconv_fct fct;
  20. }builtin_iconv_map;
  21. size_t iconv_utf8_to_utf8_ext(char **_inbuf, size_t *inbytesleft, char **_outbuf, size_t *outbytesleft)
  22. {
  23. size_t copylen;
  24. size_t inlen = *inbytesleft;
  25. size_t outlen = *outbytesleft;
  26. size_t ret = 0;
  27. if (outlen >= inlen)
  28. {
  29. copylen = inlen;
  30. }
  31. else
  32. {
  33. copylen = outlen;
  34. }
  35. memcpy(*_outbuf, *_inbuf, copylen);
  36. *_outbuf += copylen;
  37. *_inbuf += copylen;
  38. *inbytesleft = inlen - copylen;
  39. *outbytesleft = outlen - copylen;
  40. return ret;
  41. }
  42. static const builtin_iconv_map iconv_map[] =
  43. {
  44. // {"ucs2", "gb2312", iconv_ucs2_to_gb2312_ext},
  45. ///*+\NEW\liweiqiang\2013.11.26\完善gb2312<->ucs2(ucs2be)编码转换*/
  46. // {"ucs2be", "gb2312", iconv_ucs2be_to_gb2312_ext},
  47. // {"gb2312", "ucs2", iconv_gb2312_to_ucs2_ext},
  48. // {"gb2312", "ucs2be", iconv_gb2312_to_ucs2be_ext},
  49. ///*-\NEW\liweiqiang\2013.11.26\完善gb2312<->ucs2(ucs2be)编码转换*/
  50. ///*+\NEW\liweiqiang\2013.7.19\增加utf8<->ucs2,ucs2be编码转换*/
  51. // {"utf8", "ucs2", iconv_utf8_to_ucs2_ext},
  52. // {"utf8", "ucs2be", iconv_utf8_to_ucs2be_ext},
  53. // {"ucs2", "utf8", iconv_ucs2_to_utf8_ext},
  54. // {"ucs2be", "utf8", iconv_ucs2be_to_utf8_ext},
  55. ///*-\NEW\liweiqiang\2013.7.19\增加utf8<->ucs2,ucs2be编码转换*/
  56. {"UTF-8", "UTF-8", iconv_utf8_to_utf8_ext},
  57. };
  58. iconv_t iconv_open_ext (const char *__tocode, const char *__fromcode)
  59. {
  60. size_t i;
  61. for(i = 0; i < sizeof(iconv_map)/sizeof(iconv_map[0]); i++)
  62. {
  63. if(strcmp(iconv_map[i].from, __fromcode) == 0 &&
  64. strcmp(iconv_map[i].to, __tocode) == 0)
  65. {
  66. return (iconv_t)&iconv_map[i];
  67. }
  68. }
  69. return (iconv_t)-1;
  70. }
  71. size_t iconv_ext (iconv_t __cd, char ** __inbuf,
  72. size_t * __inbytesleft,
  73. char ** __outbuf,
  74. size_t * __outbytesleft)
  75. {
  76. builtin_iconv_map *_map_cd = (builtin_iconv_map *)__cd;
  77. if(__inbuf == NULL || *__inbuf == NULL)
  78. return (size_t)-1;
  79. if(_map_cd < &iconv_map[0] &&
  80. _map_cd > &iconv_map[sizeof(iconv_map)/sizeof(iconv_map[0])])
  81. return (size_t)-1;
  82. return _map_cd->fct(__inbuf, __inbytesleft, __outbuf, __outbytesleft);
  83. }
  84. int iconv_close_ext (iconv_t __cd)
  85. {
  86. return 0;
  87. }