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;
}
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
この例では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; }
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;
char *utf8_string;
memset(w_string,0,2*len+2);
//unicodeをutf 8に変換した後、utf 8符号化の長さを計算する
utf8_string=(char *)malloc(len+1);
//unicodeからutf 8への変換
free(w_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
en_AG
en_BW.utf8
en_DK.utf8
en_HK.utf8
en_IN
en_NZ.utf8
en_SG.utf8
en_ZA.utf8
POSIX
zh_CN.gbk
zh_HK.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
/******************************************************************************
*DESCRIPTION:gbk符号化からutf 8符号化への変換を実現する.
*Input:utfStr、変換後の文字列;src Str、変換する文字列;maxUtfStrlen,utfStrの最大
*
* --------------------
* --------------------
int gbk2utf8(char *utfStr,const char *srcStr,int maxUtfStrlen)
if(NULL==srcStr)
printf("Bad Parameter");
}
//まずgbk符号化をunicode符号化に変換する
return -1;
printf("Can not Transfer!!!");
}
mbstowcs(unicodeStr,srcStr,strlen(srcStr));//gbkをunicode に変換
//unicode符号化をutf 8符号化に変換
return -1;
int utfLen=wcstombs(NULL,unicodeStr,0);//変換後の長さを計算する
{
return -1;
else if(utfLen>=maxUtfStrlen)/空間が十分かどうかを判断する
printf("Dst Str memory not enough");
}
utfStr[utfLen]=0;//終了記号を追加
return utfLen;