字符集之间转换(UTF-8,UNICODE,Gb2312)

来源:互联网 发布:网站seo怎么优化 编辑:程序博客网 时间:2024/04/30 00:02
特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换.
UTF-8:   1~3字节可变
UNICODE: 2字节一个字符
GB2312:  1字节一个字符
例子: “你”字的UTF-8编码: E4 BD A0        11100100 10111101 10100000
“你”的Unicode编码: 4F 60            01001111 01100000
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
  1. 类定义   
  2.   
  3. class CChineseCode   
  4.   
  5. {   
  6.   
  7.    public:   
  8.   
  9.        static void UTF_8ToUnicode(wchar_t* pOut,char *pText);  // 把UTF-8转换成Unicode   
  10.   
  11.        static void UnicodeToUTF_8(char* pOut,wchar_t* pText);  //Unicode 转换成UTF-8  
  12.   
  13.        static void UnicodeToGB2312(char* pOut,wchar_t uData);  // 把Unicode 转换成 GB2312    
  14.   
  15.        static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode   
  16.   
  17.        static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8  
  18.   
  19.        static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312  
  20.   
  21. };   
  22.   
  23.   
  24.   
  25. 类实现   
  26.   
  27.   
  28.   
  29. void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)   
  30.   
  31. {   
  32.   
  33.     char* uchar = (char *)pOut;   
  34.   
  35.   
  36.   
  37.     uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);   
  38.   
  39.     uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);   
  40.   
  41.   
  42.   
  43.     return;   
  44.   
  45. }   
  46.   
  47.   
  48.   
  49. void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)   
  50.   
  51. {   
  52.   
  53.     // 注意 WCHAR高低字的顺序,低字节在前,高字节在后   
  54.   
  55.     char* pchar = (char *)pText;   
  56.   
  57.   
  58.   
  59.     pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));   
  60.   
  61.     pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);   
  62.   
  63.     pOut[2] = (0x80 | (pchar[0] & 0x3F));   
  64.   
  65.   
  66.   
  67.     return;   
  68.   
  69. }   
  70.   
  71.   
  72.   
  73. void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)   
  74.   
  75. {   
  76.   
  77.     WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);   
  78.   
  79.     return;   
  80.   
  81. }        
  82.   
  83.   
  84.   
  85. void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)   
  86.   
  87. {   
  88.   
  89.     ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);   
  90.   
  91.     return ;   
  92.   
  93. }   
  94.   
  95.   
  96.   
  97. void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)   
  98.   
  99. {   
  100.   
  101.     char buf[4];   
  102.   
  103.     int nLength = pLen* 3;   
  104.   
  105.     char* rst = new char[nLength];   
  106.   
  107.        
  108.   
  109.     memset(buf,0,4);   
  110.   
  111.     memset(rst,0,nLength);   
  112.   
  113.        
  114.   
  115.     int i = 0;   
  116.   
  117.     int j = 0;         
  118.   
  119.     while(i < pLen)   
  120.   
  121.     {   
  122.   
  123.             //如果是英文直接复制就可以   
  124.   
  125.             if( *(pText + i) >= 0)   
  126.   
  127.             {   
  128.   
  129.                     rst[j++] = pText[i++];   
  130.   
  131.             }   
  132.   
  133.             else   
  134.   
  135.             {   
  136.   
  137.                     wchar_t pbuffer;   
  138.   
  139.                     Gb2312ToUnicode(&pbuffer,pText+i);   
  140.   
  141.                        
  142.   
  143.                     UnicodeToUTF_8(buf,&pbuffer);   
  144.   
  145.                        
  146.   
  147.                     unsigned short int tmp = 0;   
  148.   
  149.                     tmp = rst[j] = buf[0];   
  150.   
  151.                     tmp = rst[j+1] = buf[1];   
  152.   
  153.                     tmp = rst[j+2] = buf[2];       
  154.   
  155.                        
  156.   
  157.                     j += 3;   
  158.   
  159.                     i += 2;   
  160.   
  161.             }   
  162.   
  163.     }   
  164.   
  165.     rst[j] = '';   
  166.   
  167.   
  168.   
  169.     //返回结果   
  170.   
  171.     pOut = rst;                
  172.   
  173.     delete []rst;      
  174.   
  175.        
  176.   
  177.     return;   
  178.   
  179. }   
  180.   
  181.   
  182.   
  183. void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen)   
  184.   
  185. {   
  186.   
  187.     char * newBuf = new char[pLen];   
  188.   
  189.     char Ctemp[4];   
  190.   
  191.     memset(Ctemp,0,4);   
  192.   
  193.   
  194.   
  195.     int i =0;   
  196.   
  197.     int j = 0;   
  198.   
  199.        
  200.   
  201.     while(i < pLen)   
  202.   
  203.     {   
  204.   
  205.         if(pText[i] > 0)   
  206.   
  207.         {   
  208.   
  209.                 newBuf[j++] = pText[i++];                          
  210.   
  211.         }   
  212.   
  213.         else                    
  214.   
  215.         {   
  216.   
  217.                 WCHAR Wtemp;   
  218.   
  219.                 UTF_8ToUnicode(&Wtemp,pText + i);   
  220.   
  221.            
  222.   
  223.                 UnicodeToGB2312(Ctemp,Wtemp);   
  224.   
  225.                
  226.   
  227.                 newBuf[j] = Ctemp[0];   
  228.   
  229.                 newBuf[j + 1] = Ctemp[1];   
  230.   
  231.   
  232.   
  233.                 i += 3;       
  234.   
  235.                 j += 2;      
  236.   
  237.         }   
  238.   
  239.     }   
  240.   
  241.     newBuf[j] = '';   
  242.   
  243.        
  244.   
  245.     pOut = newBuf;   
  246.   
  247.     delete []newBuf;   
  248.   
  249.        
  250.   
  251.     return;    
  252.   
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 凉菜调咸了怎么办 炖芸豆咸了怎么办 铁锅炒菜菜发黑怎么办 红豆沙馅太稀了怎么办 买的豆沙馅太稀怎么办 做的豆馅稀了怎么办 包豆沙包馅稀了怎么办 软件自定义权限重名怎么办 窗户外有垃圾桶怎么办 菜地里有蚂蚁怎么办 灯光吸引的飞虫怎么办 广告机格式化了怎么办 proe约束冲突了怎么办 中午考试想睡觉怎么办 喝了红茶睡不着怎么办 考试前状态不好怎么办 考前紧张睡不着觉怎么办 通宵失眠第二天怎么办 考试前睡不着觉怎么办 一到晚上睡不着怎么办 明天考试听力差怎么办 天天晚上睡不着觉怎么办 因紧张睡不着觉怎么办 房卡找不到了怎么办 马代不会英文怎么办 剩下的蒸米饭怎么办 临时牌照违法了怎么办 打12345不管用怎么办 省政府改变了中央文件怎么办 应聘时学历不够怎么办 做导游学历不够怎么办 市长热线打不通怎么办 12315网站不受理怎么办 法律文书生效前转后财产怎么办 打12345投诉没用怎么办 单位医保停了怎么办 iphonex开不了机怎么办 会计证三年没检怎么办 银行工作人员态度不好怎么办 生殖保健服务证怎么办 关机后自动开机怎么办