• C/C++ 字符编码的转换(ut8、gb2312)


    有三分代码

    strCoding.h

    strCoding.cpp

    test.cpp

    *******************************************************************************************************************************

    1. //这是个类strCoding (strCoding.h文件)   
    2. #pragma once   
    3. #include <iostream>   
    4. #include <string>   
    5. #include <windows.h>   
    6. using namespace std;  
    7.   
    8. class strCoding  
    9. {  
    10. public:  
    11.     strCoding(void);  
    12.     ~strCoding(void);  
    13.      
    14.     void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8转为gb2312   
    15.     void GB2312ToUTF_8(string& pOut,char *pText, int pLen); //gb2312 转utf_8   
    16.     string UrlGB2312(char * str);                           //urlgb2312编码   
    17.     string UrlUTF8(char * str);                             //urlutf8 编码   
    18.     string UrlUTF8Decode(string str);                  //urlutf8解码   
    19.     string UrlGB2312Decode(string str);                //urlgb2312解码   
    20.     
    21. private:  
    22.     void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer);  
    23.     void UTF_8ToUnicode(WCHAR* pOut,char *pText);  
    24.     void UnicodeToUTF_8(char* pOut,WCHAR* pText);  
    25.     void UnicodeToGB2312(char* pOut,WCHAR uData);  
    26.     char  CharToInt(char ch);  
    27.     char StrToBin(char *str);  
    28.   
    29. };  
    //这是个类strCoding (strCoding.h文件)
    #pragma once
    #include <iostream>
    #include <string>
    #include <windows.h>
    using namespace std;
    
    class strCoding
    {
    public:
        strCoding(void);
        ~strCoding(void);
       
        void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8转为gb2312
        void GB2312ToUTF_8(string& pOut,char *pText, int pLen); //gb2312 转utf_8
        string UrlGB2312(char * str);                           //urlgb2312编码
        string UrlUTF8(char * str);                             //urlutf8 编码
        string UrlUTF8Decode(string str);                  //urlutf8解码
        string UrlGB2312Decode(string str);                //urlgb2312解码
      
    private:
        void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer);
        void UTF_8ToUnicode(WCHAR* pOut,char *pText);
        void UnicodeToUTF_8(char* pOut,WCHAR* pText);
        void UnicodeToGB2312(char* pOut,WCHAR uData);
        char  CharToInt(char ch);
        char StrToBin(char *str);
    
    };

    *******************************************************************************************************************************

    1. //这是个类strCoding (strCoding.cpp文件)   
    2. #include "StdAfx.h"   
    3.   
    4. #include ".\strcoding.h"   
    5.   
    6.   
    7.   
    8. strCoding::strCoding(void)  
    9. {  
    10. }  
    11.   
    12. strCoding::~strCoding(void)  
    13. {  
    14. }  
    15. void strCoding::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer)  
    16. {  
    17.     ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);  
    18.     return;  
    19. }  
    20. void strCoding::UTF_8ToUnicode(WCHAR* pOut,char *pText)  
    21. {  
    22.     char* uchar = (char *)pOut;  
    23.        
    24.     uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);  
    25.     uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);  
    26.   
    27.     return;  
    28. }  
    29.   
    30. void strCoding::UnicodeToUTF_8(char* pOut,WCHAR* pText)  
    31. {  
    32.     // 注意 WCHAR高低字的顺序,低字节在前,高字节在后   
    33.     char* pchar = (char *)pText;  
    34.   
    35.     pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));  
    36.     pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);  
    37.     pOut[2] = (0x80 | (pchar[0] & 0x3F));  
    38.   
    39.     return;  
    40. }  
    41. void strCoding::UnicodeToGB2312(char* pOut,WCHAR uData)  
    42. {  
    43.     WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);  
    44.     return;  
    45. }  
    46.   
    47. //做为解Url使用   
    48. char strCoding:: CharToInt(char ch){  
    49.         if(ch>='0' && ch<='9')return (char)(ch-'0');  
    50.         if(ch>='a' && ch<='f')return (char)(ch-'a'+10);  
    51.         if(ch>='A' && ch<='F')return (char)(ch-'A'+10);  
    52.         return -1;  
    53. }  
    54. char strCoding::StrToBin(char *str){  
    55.         char tempWord[2];  
    56.         char chn;  
    57.   
    58.         tempWord[0] = CharToInt(str[0]);                         //make the B to 11 -- 00001011   
    59.         tempWord[1] = CharToInt(str[1]);                         //make the 0 to 0  -- 00000000   
    60.   
    61.         chn = (tempWord[0] << 4) | tempWord[1];                //to change the BO to 10110000   
    62.   
    63.         return chn;  
    64. }  
    65.   
    66.   
    67. //UTF_8 转gb2312   
    68. void strCoding::UTF_8ToGB2312(string &pOut, char *pText, int pLen)  
    69. {  
    70.      char buf[4];  
    71.      char* rst = new char[pLen + (pLen >> 2) + 2];  
    72.     memset(buf,0,4);  
    73.     memset(rst,0,pLen + (pLen >> 2) + 2);  
    74.   
    75.     int i =0;  
    76.     int j = 0;  
    77.         
    78.     while(i < pLen)  
    79.     {  
    80.         if(*(pText + i) >= 0)  
    81.         {  
    82.               
    83.             rst[j++] = pText[i++];  
    84.         }  
    85.         else                   
    86.         {  
    87.             WCHAR Wtemp;  
    88.   
    89.               
    90.             UTF_8ToUnicode(&Wtemp,pText + i);  
    91.                 
    92.             UnicodeToGB2312(buf,Wtemp);  
    93.               
    94.             unsigned short int tmp = 0;  
    95.             tmp = rst[j] = buf[0];  
    96.             tmp = rst[j+1] = buf[1];  
    97.             tmp = rst[j+2] = buf[2];  
    98.   
    99.             //newBuf[j] = Ctemp[0];   
    100.             //newBuf[j + 1] = Ctemp[1];   
    101.   
    102.             i += 3;      
    103.             j += 2;     
    104.         }  
    105.           
    106.   }  
    107.     rst[j]='\0';  
    108.    pOut = rst;   
    109.     delete []rst;  
    110. }  
    111.   
    112. //GB2312 转为 UTF-8   
    113. void strCoding::GB2312ToUTF_8(string& pOut,char *pText, int pLen)  
    114. {  
    115.     char buf[4];  
    116.     memset(buf,0,4);  
    117.   
    118.     pOut.clear();  
    119.   
    120.     int i = 0;  
    121.     while(i < pLen)  
    122.     {  
    123.         //如果是英文直接复制就可以   
    124.         if( pText[i] >= 0)  
    125.         {  
    126.             char asciistr[2]={0};  
    127.             asciistr[0] = (pText[i++]);  
    128.             pOut.append(asciistr);  
    129.         }  
    130.         else  
    131.         {  
    132.             WCHAR pbuffer;  
    133.             Gb2312ToUnicode(&pbuffer,pText+i);  
    134.   
    135.             UnicodeToUTF_8(buf,&pbuffer);  
    136.   
    137.             pOut.append(buf);  
    138.   
    139.             i += 2;  
    140.         }  
    141.     }  
    142.   
    143.     return;  
    144. }  
    145. //把str编码为网页中的 GB2312 url encode ,英文不变,汉字双字节  如%3D%AE%88   
    146. string strCoding::UrlGB2312(char * str)  
    147. {  
    148.     string dd;  
    149.     size_t len = strlen(str);  
    150.     for (size_t i=0;i<len;i++)  
    151.     {  
    152.         if(isalnum((BYTE)str[i]))  
    153.         {  
    154.             char tempbuff[2];  
    155.             sprintf(tempbuff,"%c",str[i]);  
    156.             dd.append(tempbuff);  
    157.         }  
    158.         else if (isspace((BYTE)str[i]))  
    159.         {  
    160.             dd.append("+");  
    161.         }  
    162.         else  
    163.         {  
    164.             char tempbuff[4];  
    165.             sprintf(tempbuff,"%%%X%X",((BYTE*)str)[i] >>4,((BYTE*)str)[i] %16);  
    166.             dd.append(tempbuff);  
    167.         }  
    168.   
    169.     }  
    170.     return dd;  
    171. }  
    172.   
    173. //把str编码为网页中的 UTF-8 url encode ,英文不变,汉字三字节  如%3D%AE%88   
    174.   
    175. string strCoding::UrlUTF8(char * str)  
    176. {  
    177.     string tt;  
    178.     string dd;  
    179.     GB2312ToUTF_8(tt,str,(int)strlen(str));  
    180.   
    181.     size_t len=tt.length();  
    182.     for (size_t i=0;i<len;i++)  
    183.     {  
    184.         if(isalnum((BYTE)tt.at(i)))  
    185.         {  
    186.             char tempbuff[2]={0};  
    187.             sprintf(tempbuff,"%c",(BYTE)tt.at(i));  
    188.             dd.append(tempbuff);  
    189.         }  
    190.         else if (isspace((BYTE)tt.at(i)))  
    191.         {  
    192.             dd.append("+");  
    193.         }  
    194.         else  
    195.         {  
    196.             char tempbuff[4];  
    197.             sprintf(tempbuff,"%%%X%X",((BYTE)tt.at(i)) >>4,((BYTE)tt.at(i)) %16);  
    198.             dd.append(tempbuff);  
    199.         }  
    200.   
    201.     }  
    202.     return dd;  
    203. }  
    204. //把url GB2312解码   
    205. string strCoding::UrlGB2312Decode(string str)  
    206. {  
    207.    string output="";  
    208.         char tmp[2];  
    209.         int i=0,idx=0,ndx,len=str.length();  
    210.           
    211.         while(i<len){  
    212.                 if(str[i]=='%'){  
    213.                         tmp[0]=str[i+1];  
    214.                         tmp[1]=str[i+2];  
    215.                         output += StrToBin(tmp);  
    216.                         i=i+3;  
    217.                 }  
    218.                 else if(str[i]=='+'){  
    219.                         output+=' ';  
    220.                         i++;  
    221.                 }  
    222.                 else{  
    223.                         output+=str[i];  
    224.                         i++;  
    225.                 }  
    226.         }  
    227.           
    228.         return output;  
    229. }  
    230. //把url utf8解码   
    231. string strCoding::UrlUTF8Decode(string str)  
    232. {  
    233.      string output="";  
    234.   
    235.     string temp =UrlGB2312Decode(str);//   
    236.   
    237.     UTF_8ToGB2312(output,(char *)temp.data(),strlen(temp.data()));  
    238.   
    239.     return output;  
    240.   
    241. }  
    //这是个类strCoding (strCoding.cpp文件)
    #include "StdAfx.h"
    
    #include ".\strcoding.h"
    
    
    
    strCoding::strCoding(void)
    {
    }
    
    strCoding::~strCoding(void)
    {
    }
    void strCoding::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer)
    {
        ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
        return;
    }
    void strCoding::UTF_8ToUnicode(WCHAR* pOut,char *pText)
    {
        char* uchar = (char *)pOut;
         
        uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
        uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
    
        return;
    }
    
    void strCoding::UnicodeToUTF_8(char* pOut,WCHAR* pText)
    {
        // 注意 WCHAR高低字的顺序,低字节在前,高字节在后
        char* pchar = (char *)pText;
    
        pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
        pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
        pOut[2] = (0x80 | (pchar[0] & 0x3F));
    
        return;
    }
    void strCoding::UnicodeToGB2312(char* pOut,WCHAR uData)
    {
        WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);
        return;
    }
    
    //做为解Url使用
    char strCoding:: CharToInt(char ch){
            if(ch>='0' && ch<='9')return (char)(ch-'0');
            if(ch>='a' && ch<='f')return (char)(ch-'a'+10);
            if(ch>='A' && ch<='F')return (char)(ch-'A'+10);
            return -1;
    }
    char strCoding::StrToBin(char *str){
            char tempWord[2];
            char chn;
    
            tempWord[0] = CharToInt(str[0]);                         //make the B to 11 -- 00001011
            tempWord[1] = CharToInt(str[1]);                         //make the 0 to 0  -- 00000000
    
            chn = (tempWord[0] << 4) | tempWord[1];                //to change the BO to 10110000
    
            return chn;
    }
    
    
    //UTF_8 转gb2312
    void strCoding::UTF_8ToGB2312(string &pOut, char *pText, int pLen)
    {
         char buf[4];
         char* rst = new char[pLen + (pLen >> 2) + 2];
        memset(buf,0,4);
        memset(rst,0,pLen + (pLen >> 2) + 2);
    
        int i =0;
        int j = 0;
          
        while(i < pLen)
        {
            if(*(pText + i) >= 0)
            {
                
                rst[j++] = pText[i++];
            }
            else                 
            {
                WCHAR Wtemp;
    
                
                UTF_8ToUnicode(&Wtemp,pText + i);
                  
                UnicodeToGB2312(buf,Wtemp);
                
                unsigned short int tmp = 0;
                tmp = rst[j] = buf[0];
                tmp = rst[j+1] = buf[1];
                tmp = rst[j+2] = buf[2];
    
                //newBuf[j] = Ctemp[0];
                //newBuf[j + 1] = Ctemp[1];
    
                i += 3;    
                j += 2;   
            }
            
      }
        rst[j]='\0';
       pOut = rst; 
        delete []rst;
    }
    
    //GB2312 转为 UTF-8
    void strCoding::GB2312ToUTF_8(string& pOut,char *pText, int pLen)
    {
        char buf[4];
        memset(buf,0,4);
    
        pOut.clear();
    
        int i = 0;
        while(i < pLen)
        {
            //如果是英文直接复制就可以
            if( pText[i] >= 0)
            {
                char asciistr[2]={0};
                asciistr[0] = (pText[i++]);
                pOut.append(asciistr);
            }
            else
            {
                WCHAR pbuffer;
                Gb2312ToUnicode(&pbuffer,pText+i);
    
                UnicodeToUTF_8(buf,&pbuffer);
    
                pOut.append(buf);
    
                i += 2;
            }
        }
    
        return;
    }
    //把str编码为网页中的 GB2312 url encode ,英文不变,汉字双字节  如%3D%AE%88
    string strCoding::UrlGB2312(char * str)
    {
        string dd;
        size_t len = strlen(str);
        for (size_t i=0;i<len;i++)
        {
            if(isalnum((BYTE)str[i]))
            {
                char tempbuff[2];
                sprintf(tempbuff,"%c",str[i]);
                dd.append(tempbuff);
            }
            else if (isspace((BYTE)str[i]))
            {
                dd.append("+");
            }
            else
            {
                char tempbuff[4];
                sprintf(tempbuff,"%%%X%X",((BYTE*)str)[i] >>4,((BYTE*)str)[i] %16);
                dd.append(tempbuff);
            }
    
        }
        return dd;
    }
    
    //把str编码为网页中的 UTF-8 url encode ,英文不变,汉字三字节  如%3D%AE%88
    
    string strCoding::UrlUTF8(char * str)
    {
        string tt;
        string dd;
        GB2312ToUTF_8(tt,str,(int)strlen(str));
    
        size_t len=tt.length();
        for (size_t i=0;i<len;i++)
        {
            if(isalnum((BYTE)tt.at(i)))
            {
                char tempbuff[2]={0};
                sprintf(tempbuff,"%c",(BYTE)tt.at(i));
                dd.append(tempbuff);
            }
            else if (isspace((BYTE)tt.at(i)))
            {
                dd.append("+");
            }
            else
            {
                char tempbuff[4];
                sprintf(tempbuff,"%%%X%X",((BYTE)tt.at(i)) >>4,((BYTE)tt.at(i)) %16);
                dd.append(tempbuff);
            }
    
        }
        return dd;
    }
    //把url GB2312解码
    string strCoding::UrlGB2312Decode(string str)
    {
       string output="";
            char tmp[2];
            int i=0,idx=0,ndx,len=str.length();
            
            while(i<len){
                    if(str[i]=='%'){
                            tmp[0]=str[i+1];
                            tmp[1]=str[i+2];
                            output += StrToBin(tmp);
                            i=i+3;
                    }
                    else if(str[i]=='+'){
                            output+=' ';
                            i++;
                    }
                    else{
                            output+=str[i];
                            i++;
                    }
            }
            
            return output;
    }
    //把url utf8解码
    string strCoding::UrlUTF8Decode(string str)
    {
         string output="";
    
        string temp =UrlGB2312Decode(str);//
    
        UTF_8ToGB2312(output,(char *)temp.data(),strlen(temp.data()));
    
        return output;
    
    }

    *******************************************************************************************************************************

    1. //test   
    2. #include "stdafx.h"   
    3. #include "strCoding.h"   
    4.   
    5. using namespace std;  
    6.   
    7.   
    8. int main()  
    9. {   
    10.       
    11.      strCoding cfm;  
    12.      string keyword="大家好,欢迎你";  
    13.      string Temp="";  
    14.      string Output="";  
    15.   
    16.      //把关键字做url的utf8编码   
    17.      Temp= cfm.UrlUTF8((char *)keyword.data());  
    18.      cout<<Temp<<endl;  
    19.       
    20.      //把url的utf8编码的结果解码   
    21.      Temp =cfm.UrlUTF8Decode(Temp);  
    22.      cout<<Temp<<endl;  
    23.   
    24.      //把关键字做url的gb2312编码   
    25.      Temp =cfm.UrlGB2312((char *)keyword.data());  
    26.      cout<<Temp<<endl;  
    27.        
    28.      //把url的gb2312编码的结果解码   
    29.      Temp =cfm.UrlGB2312Decode(Temp);  
    30.      cout<<Temp<<endl;  
    31.   
    32.   
    33.      //把关键字GB2312转UTF_8   
    34.       
    35.      cfm.GB2312ToUTF_8(Output,(char *)keyword.data(),strlen(keyword.data()));  
    36.      cout<<Output<<endl;  
    37.   
    38.      //把GB2312转UTF_8转为中文   
    39.      cfm.UTF_8ToGB2312(Temp,(char *)Output.data(),strlen(Output.data()));  
    40.      cout<<Temp<<endl;  
    41.   
    42.   
    43.     //system("pasue");   
    44.      getchar();  
    45.   
    46.     return 0;  
    47.     //   
    48. }  
  • 相关阅读:
    HDUOJ----3342Legal or Not
    HDUOJ----2647Reward
    hduoj------确定比赛名次
    HDUOJ----1165Eddy's research II
    HDUOJ-----1556Color the ball
    HDUOJ-----2175取(m堆)石子游戏
    HDUOJ---------2255奔小康赚大钱
    HDUOJ------1711Number Sequence
    HDUOJ---1712 ACboy needs your help
    HDUOJ---1867 A + B for you again
  • 原文地址:https://www.cnblogs.com/zhwl/p/2783323.html
Copyright © 2020-2023  润新知