歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下UTF 32和UTF 16互相轉換代碼

Linux下UTF 32和UTF 16互相轉換代碼

日期:2017/2/28 16:16:04   编辑:Linux教程
Linux下UTF 32和UTF 16互相轉換代碼:
  1. #define DECLARE_WCS2UTF16CONV int _len; (_len); wchar_t * _wcs; (_wcs); unsigned short * _utf16; (_utf16)
  2. #define WCS2UTF16(wcs) \
  3. (((_wcs = wcs) == NULL) ? NULL : (\
  4. _len = (utf16len(_wcs)+1),\
  5. wcs2utf16(_wcs, (unsigned short *) alloca(_len*2), _len)))
  6. #define UTF162WCS(utf16) \
  7. (((_utf16 = utf16) == NULL) ? NULL : (\
  8. _len = (xwcslen(_utf16)+1),\
  9. utf162wcs(_utf16,(wchar_t *)alloca(_len*2),_len)))
  10. unsigned short * wcs2utf16(wchar_t *wcs, unsigned short * utf16, int len)
  11. {
  12. int wc;
  13. wchar_t *end = wcs + len;
  14. unsigned short * ret = utf16;
  15. while(wcs < end)
  16. {
  17. wc = *(wcs++);
  18. if (wc > 0xFFFF)
  19. {
  20. wc -= 0x0010000UL;
  21. *utf16++ = 0xD800 | (wc >> 10);
  22. *utf16++ = 0xDC00 | (wc & 0x03FF);
  23. }
  24. else
  25. {
  26. *utf16++ = wc;
  27. }
  28. }
  29. return ret;
  30. }
  31. wchar_t * utf162wcs(unsigned short * utf16,wchar_t *wcs,int len)
  32. {
  33. int utf;
  34. unsigned short h;
  35. unsigned short l;
  36. wchar_t * ret = wcs;
  37. while(utf = *utf16++)
  38. {
  39. if(utf<0xD800||utf>0xDFFF)
  40. {
  41. *wcs++ = utf;
  42. }
  43. else
  44. {
  45. h = utf - 0xD800;
  46. l = *(utf16++) - 0xDC00;
  47. *wcs++ = ((h<<10) | l ) + 0x10000;
  48. }
  49. }
  50. return ret;
  51. }
  52. int xwcslen(unsigned short *utf16)
  53. {
  54. int utf;
  55. int ret = 0;
  56. while(utf = *utf16++)
  57. ret += ((utf < 0xD800) || (utf > 0xDFFF)) ? 2 :1;
  58. return ret;
  59. }
  60. int utf16len(wchar_t *wcs)
  61. {
  62. int wc;
  63. int ret = 0;
  64. while(wc = *wcs++)
  65. ret += wc > 0xFFFF ? 2 : 1;
  66. return ret;
  67. }
Copyright © Linux教程網 All Rights Reserved