Linuxでの漢字符号化の変換(gbkはutf 8に変換).

6436 ワード

プロジェクトの需要linuxの下でGBKコードをutf 8コードに変換するため、googleはすぐに、ネット上の関連資源は比較的に少なくて、以下の操作は本人の繰り返しの試験を経ます.この例は、他の符号化変換にも適用される.
gbkからutf 8への変換プロセスがあり、unicodeを介して中間符号化する必要がある.Windowsの変換は比較的簡単なので、まずwindowsの下の変換過程を話して、linuxの下の過程は基本的に同じで、関数の使用の上で違いがあります.
Windowsの下:
1、windowsの下で関数MultiByteToWideCharを使ってまずマルチバイト文字をunicodeに変換することができます.
2、関数WideCharToMultiByteを使用してunicodeをutf 8符号化に再変換する.
Googleで見ると、ネット上の例が多いです.ここではansiからutf 8符号化への変換を実現する簡単なソースコードを貼り付けた.
[cpp] view plain copy print ?
char *multichar_2_utf8(const char *m_string)  
  • {  

  •     int len=0;  
  •     wchar_t *w_string;  

  •     char *utf8_string;  
  • //ansiからunicodeに変換する計算後、unicode符号化の長さ
  •     len=MultiByteToWideChar(CP_ACP,0,(LPCTSTR)m_string, -1, NULL,0);//CP_ACPはunicode符号化に変換する符号化タイプを示す.
  •     w_string=(wchar_t *)malloc(2*len+2);  

  •     memset(w_string,0,2*len+2);  
  • //ansiからunicodeへの変換
  •     MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)m_string,-1,w_string, len);//CP_ACPはunicode符号化に変換する符号化タイプを示す.
  •   

  • //unicodeをutf 8に変換した後、utf 8符号化の長さを計算する
  •     len = WideCharToMultiByte(CP_UTF8, 0, w_string, -1, NULL, 0, NULL, NULL);//CP_UTF 8はunicode変換のタイプ
  • を示す.
            utf8_string=(char  *)malloc(len+1);  
  •         memset(utf8_string, 0, len + 1);  

  • //unicodeからutf 8への変換
  •         WideCharToMultiByte (CP_UTF8, 0, w_string, -1, utf8_string, len, NULL,NULL);//CP_UTF 8はunicode変換のタイプ
  • を示す.
        free(w_string);  
  •     return utf8_string;  

  • }  
    char *multichar_2_utf8(const char *m_string)
    {
    	int len=0;
    	wchar_t *w_string;
    	char *utf8_string;
        // ansi unicode ,unicode 
    	len=MultiByteToWideChar(CP_ACP,0,(LPCTSTR)m_string, -1, NULL,0);//CP_ACP unicode 
    	w_string=(wchar_t *)malloc(2*len+2);
    	memset(w_string,0,2*len+2);
        //ansi unicode 
    	MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)m_string,-1,w_string, len);//CP_ACP unicode 
    
        // unicode utf8 ,utf8 
    	len = WideCharToMultiByte(CP_UTF8, 0, w_string, -1, NULL, 0, NULL, NULL);//CP_UTF8 unicode 
        	utf8_string=(char  *)malloc(len+1);
        	memset(utf8_string, 0, len + 1);
        //unicode utf8 
        	WideCharToMultiByte (CP_UTF8, 0, w_string, -1, utf8_string, len, NULL,NULL);//CP_UTF8 unicode 
    	free(w_string);
    	return utf8_string;
    }

    Linuxの下:
    linuxには上の2つの関数はありません.mbstowcsとwcstombsを使用する必要があります.
    mbstowcsマルチバイト符号化をワイドバイト符号化に変換
    wcstombsワイドバイト符号化をマルチバイト符号化に変換
    この2つの関数は,変換中にシステム符号化タイプの影響を受け,設定により変換前と変換後の符号化タイプを設定する必要がある.関数setlocaleでシステム符号化の設定を行います.
    linuxで名前を入力
    locale-aは、システムがサポートする符号化タイプを表示します.
    [plain] view plain copy print ?
    andy@andy-linux:~$ locale -a  
  • C  

  • en_AG  
  • en_AU.utf8  

  • en_BW.utf8  
  • en_CA.utf8  

  • en_DK.utf8  
  • en_GB.utf8  

  • en_HK.utf8  
  • en_IE.utf8  

  • en_IN  
  • en_NG  

  • en_NZ.utf8  
  • en_PH.utf8  

  • en_SG.utf8  
  • en_US.utf8  

  • en_ZA.utf8  
  • en_ZW.utf8  

  • POSIX  
  • zh_CN.gb18030  

  • zh_CN.gbk  
  • zh_CN.utf8  

  • zh_HK.utf8  
  • zh_SG.utf8  

  • zh_TW.utf8  
    andy@andy-linux:~$ locale -a
    C
    en_AG
    en_AU.utf8
    en_BW.utf8
    en_CA.utf8
    en_DK.utf8
    en_GB.utf8
    en_HK.utf8
    en_IE.utf8
    en_IN
    en_NG
    en_NZ.utf8
    en_PH.utf8
    en_SG.utf8
    en_US.utf8
    en_ZA.utf8
    en_ZW.utf8
    POSIX
    zh_CN.gb18030
    zh_CN.gbk
    zh_CN.utf8
    zh_HK.utf8
    zh_SG.utf8
    zh_TW.utf8

    この例ではzh_によって実現されるCN.gbkからzh_CN.utf 8の変換
    プロセス:
    1、関数setlocale(LC_ALL、「zh_CN.gbk」)を呼び出し、トランスコードする文字列タイプをgbkタイプに設定します.
    2、関数mbstowcsを呼び出し、1設定の符号化からunicode符号化への変換を実現する.
    3、関数setlocale(LC_ALL、「zh_CN.utf 8」)を呼び出し、変換後の符号化タイプをutf 8タイプに設定する.
    4、関数wcstombsを呼び出し、unicodeから3に設定された符号化タイプの変換を実現する.次は私が書いたソースです.
     
    [cpp] view plain copy print ?
    #include    
  • #include    

  •   
  •   

  • /****************************************************************************** 
  •  * FUNCTION: gbk2utf8 

  • *DESCRIPTION:gbk符号化からutf 8符号化への変換を実現する.
  •  *  

  • *Input:utfStr、変換後の文字列;src Str、変換する文字列;maxUtfStrlen,utfStrの最大
  • 大長
  •  * Output: utfStr 
  •  * Returns: -1,fail;>0,success 

  •  *  
  •  * modification history 

  •  * -------------------- 
  •  *  2011-nov-25, lvhongya written 

  •  * -------------------- 
  •  ******************************************************************************/  

  • int gbk2utf8(char *utfStr,const char *srcStr,int maxUtfStrlen)  
  • {  

  •     if(NULL==srcStr)  
  •     {  

  •         printf("Bad Parameter");  
  •         return -1;  

  •     }  
  •   

  • //まずgbk符号化をunicode符号化に変換する
  • if(NULL==setlocale(LC_ALL、「zh_CN.gbk」)//unicodeに変換する前のコードを設定し、現在gbk符号化
  •     {  
  •         printf("Bad Parameter");  

  •         return -1;  
  •     }  

  •   
  •     int unicodeLen=mbstowcs(NULL,srcStr,0);//変換後の長さを計算する
  •     if(unicodeLen<=0)  
  •     {  

  •         printf("Can not Transfer!!!");  
  •         return -1;  

  •     }  
  •     wchar_t *unicodeStr=(wchar_t *)calloc(sizeof(wchar_t),unicodeLen+1);  

  •     mbstowcs(unicodeStr,srcStr,strlen(srcStr));//gbkをunicode に変換
  •       

  • //unicode符号化をutf 8符号化に変換
  • if(NULL=setlocale(LC_ALL、「zh_CN.utf 8」)//unicode変換後のコードを設定し、現在utf 8
  •     {  
  •         printf("Bad Parameter");  

  •         return -1;  
  •     }  

  •     int utfLen=wcstombs(NULL,unicodeStr,0);//変換後の長さを計算する
  •     if(utfLen<=0)  

  •     {  
  •         printf("Can not Transfer!!!");  

  •         return -1;  
  •     }  

  • else if(utfLen>=maxUtfStrlen)/空間が十分かどうかを判断する
  •     {  

  •         printf("Dst Str memory not enough");  
  •         return -1;  

  •     }  
  •     wcstombs(utfStr,unicodeStr,utfLen);  

  •     utfStr[utfLen]=0;//終了記号を追加
  •     free(unicodeStr);  

  •     return utfLen;  
  • }