不依赖任何系统API,用c语言实现gbk/utf8/unicode编码转换

前端之家收集整理的这篇文章主要介绍了不依赖任何系统API,用c语言实现gbk/utf8/unicode编码转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
汉字'我'
Unicode编码是 0x6211 0110 0010 00 010001
UTF8编码是 0xe68891 1110 0110 10 001000 100 010001
oxc0 11000000
0xE0 11100000
| Unicode符号范围 | UTF-8编码方式
n | (十六进制) | (二进制)
---+----------------------- -----------+--------------------------------------------------------------------------
1 | 0x00 - 0x7F | 0zzzzzzz
2 | 0x80 - 0x7FF | 110yyyyy 10zzzzzz
3 | 0x800 - 0xFFFF | 1110xxxx 10yyyyyy 10zzzzzz
--------------------------------------------------------------------------------------------------------------------
4 | 0x10000 - 0x1FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 | 0x200000 - 0x3FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 | 0x4000000 - 0x7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

表 UTF-8的编码规则

一:unicode转utf8

'我'的unicode编码0x6211,二进制为:01100010 00010001
将二进制形式分割成3段为0110 001000
010001 (分别是高4位、中间的6位、最后的低6位)
unicode转utf8只需要这3段分别填入1110xxxx 10yyyyyy 10zzzzzz中的xxxx yyyyyy zzzzzz
得utf8编码是0xe6889,二进制为: 11100110 10001000 100010001

  1. int UnicodeToUtf8(char* pInput,char *pOutput)
  2. {
  3. int len = 0; //记录转换后的Utf8字符串的字节数
  4. while (*pInput)
  5. {
  6. //处理一个unicode字符
  7. char low = *pInput;//取出unicode字符的低8位
  8. pInput++;
  9. char high = *pInput;//取出unicode字符的高8位
  10. int w=high<<8;
  11. unsigned wchar = (high<<8)+low;//高8位和低8位组成一个unicode字符,加法运算级别高
  12.  
  13. if (wchar <= 0x7F ) //英文字
  14. {
  15. pOutput[len] = (char)wchar; //取wchar的低8位
  16. len++;
  17. }
  18. else if (wchar >=0x80 && wchar <= 0x7FF) //可以转换成双字节pOutput字符
  19. {
  20. pOutput[len] = 0xc0 |((wchar >> 6)&0x1f); //取出unicode编码低6位后的5位,填充到110yyyyy 10zzzzzz 的yyyyy中
  21. len++;
  22. pOutput[len] = 0x80 | (wchar & 0x3f); //取出unicode编码的低6位,填充到110yyyyy 10zzzzzz 的zzzzzz中
  23. len++;
  24. }
  25. else if (wchar >=0x800 && wchar < 0xFFFF) //可以转换成3个字节的pOutput字符
  26. {
  27. pOutput[len] = 0xe0 | ((wchar >> 12)&0x0f); //高四位填入1110xxxx 10yyyyyy 10zzzzzz中的xxxx
  28. len++;
  29. pOutput[len] = 0x80 | ((wchar >> 6) & 0x3f); //中间6位填入1110xxxx 10yyyyyy 10zzzzzz中的yyyyyy
  30. len++;
  31. pOutput[len] = 0x80 | (wchar & 0x3f); //低6位填入1110xxxx 10yyyyyy 10zzzzzz中的zzzzzz
  32. len++;
  33. }
  34.  
  35. else //对于其他字节数的unicode字符不进行处理
  36. {
  37. return -1;
  38. }
  39. pInput ++;//处理下一个unicode字符
  40. }
  41. //utf8字符串后面,有个\0
  42. pOutput [len]= 0;
  43. return len;
  44. }

二:utf8转unicode

utf8二进制形式为1110xxxx 10yyyyyy 10zzzzzz
'我'的utf8编码0xe6889,二进制为:1110 0110 10 001000 10 0010001
分别提取里面的xxxx yyyyyy zzzzzz,然后组合成xxxxyyyy yyzzzzzz,
xxxxyyyy就是unicode的高8位,yyzzzzzz就是unicode的低8位

  1. /*************************************************************************************************
  2. * 将UTF8编码转换成Unicode(UCS-2LE)编码 低地址存低位字节
  3. * 参数:
  4. * char* pInput 输入字符串
  5. * char*pOutput 输出字符串
  6. * 返回值:转换后的Unicode字符串的字节数,如果出错则返回-1
  7. **************************************************************************************************/
  8. //utf8转unicode
  9. int Utf8ToUnicode(char* pInput,char* pOutput)
  10. {
  11. int outputSize = 0; //记录转换后的Unicode字符串的字节数
  12.  
  13. while (*pInput)
  14. {
  15. if (*pInput > 0x00 && *pInput <= 0x7F) //处理单字节UTF8字符(英文字母、数字)
  16. {
  17. *pOutput = *pInput;
  18. pOutput++;
  19. *pOutput = 0; //小端法表示,在高地址填补0
  20. }
  21. else if (((*pInput) & 0xE0) == 0xC0) //处理双字节UTF8字符
  22. {
  23. char high = *pInput;
  24. pInput++;
  25. char low = *pInput;
  26. if ((low & 0xC0) != 0x80) //检查是否为合法的UTF8字符表示
  27. {
  28. return -1; //如果不是则报错
  29. }
  30.  
  31. *pOutput = (high << 6) + (low & 0x3F);
  32. pOutput++;
  33. *pOutput = (high >> 2) & 0x07;
  34. }
  35. else if (((*pInput) & 0xF0) == 0xE0) //处理三字节UTF8字符
  36. {
  37. char high = *pInput;
  38. pInput++;
  39. char middle = *pInput;
  40. pInput++;
  41. char low = *pInput;
  42. if (((middle & 0xC0) != 0x80) || ((low & 0xC0) != 0x80))
  43. {
  44. return -1;
  45. }
  46. *pOutput = (middle << 6) + (low & 0x3F);//取出middle的低两位与low的低6位,组合成unicode字符的低8位
  47. pOutput++;
  48. *pOutput = (high << 4) + ((middle >> 2) & 0x0F); //取出high的低四位与middle的中间四位,组合成unicode字符的高8位
  49. }
  50. else //对于其他字节数的UTF8字符不进行处理
  51. {
  52. return -1;
  53. }
  54. pInput ++;//处理下一个utf8字符
  55. pOutput ++;
  56. outputSize += 2;
  57. }
  58. //unicode字符串后面,有两个\0
  59. *pOutput = 0;
  60. pOutput++;
  61. *pOutput = 0;
  62. return outputSize;
  63. }
  1. //一个调用示例
  2. int main(int argc,char** argv)
  3. {
  4. //汉字“我”的UTF8编码是0xe68891,Unicode编码是 0x6211
  5.  
  6. //1、unicode转utf8
  7. char unicodeStr[3]={0x11,0x62,0x00};//我的unicode编码是0x6211,按低地址存低位字节
  8. char* utf8Str = new char [5];
  9. memset(utf8Str,5);
  10. int num = UnicodeToUtf8(unicodeStr,utf8Str);
  11.  
  12. unsigned char* p = (unsigned char*)utf8Str;
  13. for (int i = 0; i < num; i++)
  14. {
  15. printf("%0x",*p);
  16. p++;
  17. }//输出e68891
  18. printf("\n");
  19. delete utf8Str;
  20.  
  21. //2、utf8转unicode
  22. //char utf8Str[4] = {0xe6,0x88,0x91,0x00};
  23. //char* unicodeStr = new char[8];
  24. //memset(unicodeStr,8);
  25. //int num = Utf8ToUnicode(utf8Str,unicodeStr);
  26. //if (num == -1)
  27. //{
  28. // printf("Error!\n");
  29. //}
  30. //else
  31. //{
  32. // unsigned char* p = (unsigned char*)unicodeStr;
  33. // for (int i = 0; i < num; i++)
  34. // {
  35. // printf("%0x",*p);
  36. // p++;
  37. // }//输出1162
  38. // printf("\n");
  39. //}
  40. //delete unicodeStr;
  41.  
  42. return 0;
  43. }

三、gbk与unicode互转


参照博客

http://blog.csdn.net/tge7618291/article/details/7599902 http://www.ithao123.cn/content-1832906.html

猜你在找的设计模式相关文章