Unicode码和UTF-8编码的C语言转换代码

  1. 1) 将一个字符的Unicode(UCS-2和UCS-4)编码转换成UTF-8编码.  
  2.   
  3. // #c---  
  4. /***************************************************************************** 
  5.  * 将一个字符的Unicode(UCS-2和UCS-4)编码转换成UTF-8编码. 
  6.  * 
  7.  * 參数: 
  8.  *    unic     字符的Unicode编码值 
  9.  *    pOutput  指向输出的用于存储UTF8编码值的缓冲区的指针 
  10.  *    outsize  pOutput缓冲的大小 
  11.  * 
  12.  * 返回值: 
  13.  *    返回转换后的字符的UTF8编码所占的字节数, 假设出错则返回 0 . 
  14.  * 
  15.  * 注意: 
  16.  *     1. UTF8没有字节序问题, 可是Unicode有字节序要求; 
  17.  *        字节序分为大端(Big Endian)和小端(Little Endian)两种; 
  18.  *        在Intel处理器中採用小端法表示, 在此採用小端法表示. (低地址存低位) 
  19.  *     2. 请保证 pOutput 缓冲区有最少有 6 字节的空间大小! 
  20.  ****************************************************************************/  
  21. int enc_unicode_to_utf8_one(unsigned long unic, unsigned char *pOutput,  
  22.         int outSize)  
  23. {  
  24.     assert(pOutput != NULL);  
  25.     assert(outSize >= 6);  
  26.   
  27.     if ( unic <= 0x0000007F )  
  28.     {  
  29.         // * U-00000000 - U-0000007F:  0xxxxxxx  
  30.         *pOutput     = (unic & 0x7F);  
  31.         return 1;  
  32.     }  
  33.     else if ( unic >= 0x00000080 && unic <= 0x000007FF )  
  34.     {  
  35.         // * U-00000080 - U-000007FF:  110xxxxx 10xxxxxx  
  36.         *(pOutput+1) = (unic & 0x3F) | 0x80;  
  37.         *pOutput     = ((unic >> 6) & 0x1F) | 0xC0;  
  38.         return 2;  
  39.     }  
  40.     else if ( unic >= 0x00000800 && unic <= 0x0000FFFF )  
  41.     {  
  42.         // * U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx  
  43.         *(pOutput+2) = (unic & 0x3F) | 0x80;  
  44.         *(pOutput+1) = ((unic >>  6) & 0x3F) | 0x80;  
  45.         *pOutput     = ((unic >> 12) & 0x0F) | 0xE0;  
  46.         return 3;  
  47.     }  
  48.     else if ( unic >= 0x00010000 && unic <= 0x001FFFFF )  
  49.     {  
  50.         // * U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
  51.         *(pOutput+3) = (unic & 0x3F) | 0x80;  
  52.         *(pOutput+2) = ((unic >>  6) & 0x3F) | 0x80;  
  53.         *(pOutput+1) = ((unic >> 12) & 0x3F) | 0x80;  
  54.         *pOutput     = ((unic >> 18) & 0x07) | 0xF0;  
  55.         return 4;  
  56.     }  
  57.     else if ( unic >= 0x00200000 && unic <= 0x03FFFFFF )  
  58.     {  
  59.         // * U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  60.         *(pOutput+4) = (unic & 0x3F) | 0x80;  
  61.         *(pOutput+3) = ((unic >>  6) & 0x3F) | 0x80;  
  62.         *(pOutput+2) = ((unic >> 12) & 0x3F) | 0x80;  
  63.         *(pOutput+1) = ((unic >> 18) & 0x3F) | 0x80;  
  64.         *pOutput     = ((unic >> 24) & 0x03) | 0xF8;  
  65.         return 5;  
  66.     }  
  67.     else if ( unic >= 0x04000000 && unic <= 0x7FFFFFFF )  
  68.     {  
  69.         // * U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  70.         *(pOutput+5) = (unic & 0x3F) | 0x80;  
  71.         *(pOutput+4) = ((unic >>  6) & 0x3F) | 0x80;  
  72.         *(pOutput+3) = ((unic >> 12) & 0x3F) | 0x80;  
  73.         *(pOutput+2) = ((unic >> 18) & 0x3F) | 0x80;  
  74.         *(pOutput+1) = ((unic >> 24) & 0x3F) | 0x80;  
  75.         *pOutput     = ((unic >> 30) & 0x01) | 0xFC;  
  76.         return 6;  
  77.     }  
  78.   
  79.     return 0;  
  80. }  

  1. // #c---end  


[cpp]  view plain copy
  1. 2) 将一个字符的UTF8编码转换成Unicode(UCS-2和UCS-4)编码.

  2. /***************************************************************************** 
  3.  * 将一个字符的UTF8编码转换成Unicode(UCS-2和UCS-4)编码. 
  4.  * 
  5.  * 參数: 
  6.  *    pInput      指向输入缓冲区, 以UTF-8编码 
  7.  *    Unic        指向输出缓冲区, 其保存的数据即是Unicode编码值, 
  8.  *                类型为unsigned long . 
  9.  * 
  10.  * 返回值: 
  11.  *    成功则返回该字符的UTF8编码所占用的字节数; 失败则返回0. 
  12.  * 
  13.  * 注意: 
  14.  *     1. UTF8没有字节序问题, 可是Unicode有字节序要求; 
  15.  *        字节序分为大端(Big Endian)和小端(Little Endian)两种; 
  16.  *        在Intel处理器中採用小端法表示, 在此採用小端法表示. (低地址存低位) 
  17.  ****************************************************************************/  
  18. int enc_utf8_to_unicode_one(const unsigned char* pInput, unsigned long *Unic)  
  19. {  
  20.     assert(pInput != NULL && Unic != NULL);  
  21.   
  22.     // b1 表示UTF-8编码的pInput中的高字节, b2 表示次高字节, ...  
  23.     char b1, b2, b3, b4, b5, b6;  
  24.   
  25.     *Unic = 0x0; // 把 *Unic 初始化为全零  
  26.     int utfbytes = enc_get_utf8_size(*pInput);  
  27.     unsigned char *pOutput = (unsigned char *) Unic;  
  28.   
  29.     switch ( utfbytes )  
  30.     {  
  31.         case 1:  
  32.             *pOutput     = *pInput;  
  33.             utfbytes    += 1;  
  34.             break;  
  35.         case 2:  
  36.             b1 = *pInput;  
  37.             b2 = *(pInput + 1);  
  38.             if ( (b2 & 0xE0) != 0x80 )  
  39.                 return 0;  
  40.             *pOutput     = (b1 << 6) + (b2 & 0x3F);  
  41.             *(pOutput+1) = (b1 >> 2) & 0x07;  
  42.             break;  
  43.         case 3:  
  44.             b1 = *pInput;  
  45.             b2 = *(pInput + 1);  
  46.             b3 = *(pInput + 2);  
  47.             if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80) )  
  48.                 return 0;  
  49.             *pOutput     = (b2 << 6) + (b3 & 0x3F);  
  50.             *(pOutput+1) = (b1 << 4) + ((b2 >> 2) & 0x0F);  
  51.             break;  
  52.         case 4:  
  53.             b1 = *pInput;  
  54.             b2 = *(pInput + 1);  
  55.             b3 = *(pInput + 2);  
  56.             b4 = *(pInput + 3);  
  57.             if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)  
  58.                     || ((b4 & 0xC0) != 0x80) )  
  59.                 return 0;  
  60.             *pOutput     = (b3 << 6) + (b4 & 0x3F);   //UTF-8转Unicode存在逆序存放问题
  61.             *(pOutput+1) = (b2 << 4) + ((b3 >> 2) & 0x0F);  
  62.             *(pOutput+2) = ((b1 << 2) & 0x1C)  + ((b2 >> 4) & 0x03);  
  63.             break;  
  64.         case 5:  
  65.             b1 = *pInput;  
  66.             b2 = *(pInput + 1);  
  67.             b3 = *(pInput + 2);  
  68.             b4 = *(pInput + 3);  
  69.             b5 = *(pInput + 4);  
  70.             if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)  
  71.                     || ((b4 & 0xC0) != 0x80) || ((b5 & 0xC0) != 0x80) )  
  72.                 return 0;  
  73.             *pOutput     = (b4 << 6) + (b5 & 0x3F);  
  74.             *(pOutput+1) = (b3 << 4) + ((b4 >> 2) & 0x0F);  
  75.             *(pOutput+2) = (b2 << 2) + ((b3 >> 4) & 0x03);  
  76.             *(pOutput+3) = (b1 << 6);  
  77.             break;  
  78.         case 6:  
  79.             b1 = *pInput;  
  80.             b2 = *(pInput + 1);  
  81.             b3 = *(pInput + 2);  
  82.             b4 = *(pInput + 3);  
  83.             b5 = *(pInput + 4);  
  84.             b6 = *(pInput + 5);  
  85.             if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)  
  86.                     || ((b4 & 0xC0) != 0x80) || ((b5 & 0xC0) != 0x80)  
  87.                     || ((b6 & 0xC0) != 0x80) )  
  88.                 return 0;  
  89.             *pOutput     = (b5 << 6) + (b6 & 0x3F);  
  90.             *(pOutput+1) = (b5 << 4) + ((b6 >> 2) & 0x0F);  
  91.             *(pOutput+2) = (b3 << 2) + ((b4 >> 4) & 0x03);  
  92.             *(pOutput+3) = ((b1 << 6) & 0x40) + (b2 & 0x3F);  
  93.             break;  
  94.         default:  
  95.             return 0;  
  96.             break;  
  97.     }  
  98.   
  99.     return utfbytes;  
  100. }  
  101. // #c---end  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值