感谢支持
我们一直在努力

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

赞(0) 打赏
转载请注明出处:服务器评测 » Linux下UTF 32和UTF 16互相转换代码
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏