天天看點

C/C++ 字元編碼的轉換(ut8、gb2312)

有三分代碼

strCoding.h

strCoding.cpp

test.cpp

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

[cpp] view plaincopyprint?

  1. //這是個類strCoding (strCoding.h檔案)   
  2. #pragma once   
  3. #include <iostream>   
  4. #include <string>   
  5. #include <windows.h>   
  6. using namespace std;  
  7. class strCoding  
  8. {  
  9. public:  
  10.     strCoding(void);  
  11.     ~strCoding(void);  
  12.     void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8轉為gb2312   
  13.     void GB2312ToUTF_8(string& pOut,char *pText, int pLen); //gb2312 轉utf_8   
  14.     string UrlGB2312(char * str);                           //urlgb2312編碼   
  15.     string UrlUTF8(char * str);                             //urlutf8 編碼   
  16.     string UrlUTF8Decode(string str);                  //urlutf8解碼   
  17.     string UrlGB2312Decode(string str);                //urlgb2312解碼   
  18. private:  
  19.     void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer);  
  20.     void UTF_8ToUnicode(WCHAR* pOut,char *pText);  
  21.     void UnicodeToUTF_8(char* pOut,WCHAR* pText);  
  22.     void UnicodeToGB2312(char* pOut,WCHAR uData);  
  23.     char  CharToInt(char ch);  
  24.     char StrToBin(char *str);  
  25. };  
//這是個類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. #include ".\strcoding.h"   
  4. strCoding::strCoding(void)  
  5. }  
  6. strCoding::~strCoding(void)  
  7. void strCoding::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer)  
  8.     ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);  
  9.     return;  
  10. void strCoding::UTF_8ToUnicode(WCHAR* pOut,char *pText)  
  11.     char* uchar = (char *)pOut;  
  12.     uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);  
  13.     uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);  
  14. void strCoding::UnicodeToUTF_8(char* pOut,WCHAR* pText)  
  15.     // 注意 WCHAR高低字的順序,低位元組在前,高位元組在後   
  16.     char* pchar = (char *)pText;  
  17.     pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));  
  18.     pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);  
  19.     pOut[2] = (0x80 | (pchar[0] & 0x3F));  
  20. void strCoding::UnicodeToGB2312(char* pOut,WCHAR uData)  
  21.     WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);  
  22. //做為解Url使用   
  23. char strCoding:: CharToInt(char ch){  
  24.         if(ch>='0' && ch<='9')return (char)(ch-'0');  
  25.         if(ch>='a' && ch<='f')return (char)(ch-'a'+10);  
  26.         if(ch>='A' && ch<='F')return (char)(ch-'A'+10);  
  27.         return -1;  
  28. char strCoding::StrToBin(char *str){  
  29.         char tempWord[2];  
  30.         char chn;  
  31.         tempWord[0] = CharToInt(str[0]);                         //make the B to 11 -- 00001011   
  32.         tempWord[1] = CharToInt(str[1]);                         //make the 0 to 0  -- 00000000   
  33.         chn = (tempWord[0] << 4) | tempWord[1];                //to change the BO to 10110000   
  34.         return chn;  
  35. //UTF_8 轉gb2312   
  36. void strCoding::UTF_8ToGB2312(string &pOut, char *pText, int pLen)  
  37.      char buf[4];  
  38.      char* rst = new char[pLen + (pLen >> 2) + 2];  
  39.     memset(buf,0,4);  
  40.     memset(rst,0,pLen + (pLen >> 2) + 2);  
  41.     int i =0;  
  42.     int j = 0;  
  43.     while(i < pLen)  
  44.     {  
  45.         if(*(pText + i) >= 0)  
  46.         {  
  47.             rst[j++] = pText[i++];  
  48.         }  
  49.         else                   
  50.             WCHAR Wtemp;  
  51.             UTF_8ToUnicode(&Wtemp,pText + i);  
  52.             UnicodeToGB2312(buf,Wtemp);  
  53.             unsigned short int tmp = 0;  
  54.             tmp = rst[j] = buf[0];  
  55.             tmp = rst[j+1] = buf[1];  
  56.             tmp = rst[j+2] = buf[2];  
  57.             //newBuf[j] = Ctemp[0];   
  58.             //newBuf[j + 1] = Ctemp[1];   
  59.             i += 3;      
  60.             j += 2;     
  61.   }  
  62.     rst[j]='\0';  
  63.    pOut = rst;   
  64.     delete []rst;  
  65. //GB2312 轉為 UTF-8   
  66. void strCoding::GB2312ToUTF_8(string& pOut,char *pText, int pLen)  
  67.     char buf[4];  
  68.     pOut.clear();  
  69.     int i = 0;  
  70.         //如果是英文直接複制就可以   
  71.         if( pText[i] >= 0)  
  72.             char asciistr[2]={0};  
  73.             asciistr[0] = (pText[i++]);  
  74.             pOut.append(asciistr);  
  75.         else  
  76.             WCHAR pbuffer;  
  77.             Gb2312ToUnicode(&pbuffer,pText+i);  
  78.             UnicodeToUTF_8(buf,&pbuffer);  
  79.             pOut.append(buf);  
  80.             i += 2;  
  81.     }  
  82. //把str編碼為網頁中的 GB2312 url encode ,英文不變,漢字雙位元組  如%3D%AE%88   
  83. string strCoding::UrlGB2312(char * str)  
  84.     string dd;  
  85.     size_t len = strlen(str);  
  86.     for (size_t i=0;i<len;i++)  
  87.         if(isalnum((BYTE)str[i]))  
  88.             char tempbuff[2];  
  89.             sprintf(tempbuff,"%c",str[i]);  
  90.             dd.append(tempbuff);  
  91.         else if (isspace((BYTE)str[i]))  
  92.             dd.append("+");  
  93.             char tempbuff[4];  
  94.             sprintf(tempbuff,"%%%X%X",((BYTE*)str)[i] >>4,((BYTE*)str)[i] %16);  
  95.     return dd;  
  96. //把str編碼為網頁中的 UTF-8 url encode ,英文不變,漢字三位元組  如%3D%AE%88   
  97. string strCoding::UrlUTF8(char * str)  
  98.     string tt;  
  99.     GB2312ToUTF_8(tt,str,(int)strlen(str));  
  100.     size_t len=tt.length();  
  101.         if(isalnum((BYTE)tt.at(i)))  
  102.             char tempbuff[2]={0};  
  103.             sprintf(tempbuff,"%c",(BYTE)tt.at(i));  
  104.         else if (isspace((BYTE)tt.at(i)))  
  105.             sprintf(tempbuff,"%%%X%X",((BYTE)tt.at(i)) >>4,((BYTE)tt.at(i)) %16);  
  106. //把url GB2312解碼   
  107. string strCoding::UrlGB2312Decode(string str)  
  108.    string output="";  
  109.         char tmp[2];  
  110.         int i=0,idx=0,ndx,len=str.length();  
  111.         while(i<len){  
  112.                 if(str[i]=='%'){  
  113.                         tmp[0]=str[i+1];  
  114.                         tmp[1]=str[i+2];  
  115.                         output += StrToBin(tmp);  
  116.                         i=i+3;  
  117.                 }  
  118.                 else if(str[i]=='+'){  
  119.                         output+=' ';  
  120.                         i++;  
  121.                 else{  
  122.                         output+=str[i];  
  123.         return output;  
  124. //把url utf8解碼   
  125. string strCoding::UrlUTF8Decode(string str)  
  126.      string output="";  
  127.     string temp =UrlGB2312Decode(str);//   
  128.     UTF_8ToGB2312(output,(char *)temp.data(),strlen(temp.data()));  
  129.     return output;  
//這是個類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. int main()  
  5. {   
  6.      strCoding cfm;  
  7.      string keyword="大家好,歡迎你";  
  8.      string Temp="";  
  9.      string Output="";  
  10.      //把關鍵字做url的utf8編碼   
  11.      Temp= cfm.UrlUTF8((char *)keyword.data());  
  12.      cout<<Temp<<endl;  
  13.      //把url的utf8編碼的結果解碼   
  14.      Temp =cfm.UrlUTF8Decode(Temp);  
  15.      //把關鍵字做url的gb2312編碼   
  16.      Temp =cfm.UrlGB2312((char *)keyword.data());  
  17.      //把url的gb2312編碼的結果解碼   
  18.      Temp =cfm.UrlGB2312Decode(Temp);  
  19.      //把關鍵字GB2312轉UTF_8   
  20.      cfm.GB2312ToUTF_8(Output,(char *)keyword.data(),strlen(keyword.data()));  
  21.      cout<<Output<<endl;  
  22.      //把GB2312轉UTF_8轉為中文   
  23.      cfm.UTF_8ToGB2312(Temp,(char *)Output.data(),strlen(Output.data()));  
  24.     //system("pasue");   
  25.      getchar();  
  26.     return 0;  
  27.     //