iconv.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. static const builtin_iconv_map iconv_map[] =
  22. {
  23. {"ucs2", "gb2312", iconv_ucs2_to_gb2312},
  24. /*+\NEW\liweiqiang\2013.11.26\完善gb2312<->ucs2(ucs2be)编码转换*/
  25. {"ucs2be", "gb2312", iconv_ucs2be_to_gb2312},
  26. {"gb2312", "ucs2", iconv_gb2312_to_ucs2},
  27. {"gb2312", "ucs2be", iconv_gb2312_to_ucs2be},
  28. /*-\NEW\liweiqiang\2013.11.26\完善gb2312<->ucs2(ucs2be)编码转换*/
  29. /*+\NEW\liweiqiang\2013.7.19\增加utf8<->ucs2,ucs2be编码转换*/
  30. {"utf8", "ucs2", iconv_utf8_to_ucs2},
  31. {"utf8", "ucs2be", iconv_utf8_to_ucs2be},
  32. {"ucs2", "utf8", iconv_ucs2_to_utf8},
  33. {"ucs2be", "utf8", iconv_ucs2be_to_utf8},
  34. /*-\NEW\liweiqiang\2013.7.19\增加utf8<->ucs2,ucs2be编码转换*/
  35. };
  36. iconv_t iconv_open (const char *__tocode, const char *__fromcode)
  37. {
  38. size_t i;
  39. for(i = 0; i < sizeof(iconv_map)/sizeof(iconv_map[0]); i++)
  40. {
  41. if(strcmp(iconv_map[i].from, __fromcode) == 0 &&
  42. strcmp(iconv_map[i].to, __tocode) == 0)
  43. {
  44. return (iconv_t)&iconv_map[i];
  45. }
  46. }
  47. return (iconv_t)-1;
  48. }
  49. size_t iconv (iconv_t __cd, char ** __inbuf,
  50. size_t * __inbytesleft,
  51. char ** __outbuf,
  52. size_t * __outbytesleft)
  53. {
  54. builtin_iconv_map *_map_cd = (builtin_iconv_map *)__cd;
  55. if(__inbuf == NULL || *__inbuf == NULL)
  56. return (size_t)-1;
  57. if(_map_cd < &iconv_map[0] &&
  58. _map_cd > &iconv_map[sizeof(iconv_map)/sizeof(iconv_map[0])])
  59. return (size_t)-1;
  60. return _map_cd->fct(__inbuf, __inbytesleft, __outbuf, __outbytesleft);
  61. }
  62. int iconv_close (iconv_t __cd)
  63. {
  64. return 0;
  65. }