Linux下UTF 32和UTF 16互相转换代码


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. }  

相关内容