因為Windows控件全部使用UNICODE編碼字符(或ANSI),而我文人卻喜歡使用UTF8編碼字符,所以需要在UTF8與UNICODE之間相互轉換,而我在2010年12月7日寫的一個字符轉換函式庫剛好派上用場.所有轉換MultiByteToWideChar()與WideCharToMultiByte()兩個函式完成,轉換後以NULL字符結尾.特將其簡化並記錄如下,便於以後移植使用.
多字節字符(ANSI/UTF-8)轉換寬字符(UNICODE)
int MultiByteToWideChar(
UINT CodePage, // 代碼頁
DWORD dwFlags, // 字符標誌, 默認設為0
LPCSTR lpMultiByteStr, //多字節字符
int cchMultiByte, //多字節字符個數
LPWSTR lpWideCharStr, // 寬字符輸出緩存
int cchWideChar //寬字符緩存大小
);
寬字符(UNICODE)轉換多字節字符(ANSI/UTF-8)
int WideCharToMultiByte(
UINT CodePage, //代碼頁
DWORD dwFlags, // 字符標誌, 默認設為0
LPCWSTR lpWideCharStr, // 寬字符
int cchWideChar, //寬字符長度
LPSTR lpMultiByteStr, //多字節字符輸出緩存
int cchMultiByte, //多字節字符緩存輸出大小
LPCSTR lpDefaultChar, // 自定義寬字符,默認設為NULL
LPBOOL lpUsedDefaultChar // 是否使用寬字符
);
//——————————————————————
// Ansi轉換Unicode
// Unicode:Unicode碼文本輸出
// Unicode_Size:Unicode碼輸出緩衝區WORD的長度
// Ansi:ANSI碼文本輸入,以NULL字符接尾
// Encode:ANSI文本字符編碼
// 返回值:Unicode 字符個數!(Unicode一個字符需兩個字節)
//——————————————————————
int Ansi_To_Unicode(WCHAR * Unicode,int Unicode_Size,char * Ansi,int Encode)
{
int Unicode_Length;// Unicode 字符個數!非字節數!
if(Unicode == NULL || Ansi == NULL)
return 0;
// Ansi轉換Unicode
Unicode_Length = MultiByteToWideChar(Encode, NULL, Ansi,strlen(Ansi), Unicode, Unicode_Size);// 轉換
Unicode[Unicode_Length] = 0;
return Unicode_Length;
}
//——————————————————————
//Unicode轉換Ansi
//Ansi:ANSI碼文本輸出
//Unicode_Size:Unicode碼輸出緩衝區WORD的長度
//Unicode:Unicode碼文本輸入
//返回值:Ansi所占字節數!
//——————————————————————
int Unicode_To_Ansi(char* Ansi,int Ansi_Size,PWORD Unicode)
{
int Ansi_Length;
if(Ansi == NULL || Unicode == 0)
return 0;
//Unicode轉換Ansi
Ansi_Length = WideCharToMultiByte(CP_ACP, NULL, Unicode, wcslen(Unicode), Ansi, Ansi_Size, NULL, NULL);
Ansi[Ansi_Length] = NULL;
return Ansi_Length;
}
//——————————————————————
// UTF-8 轉 Unicode
//Unicode:Unicode碼文本輸出
//Unicode_Size:Unicode碼輸出緩衝區WORD的長度
//Utf8:Utf-8文本輸入
//返回值:UTF-8字符個數!
//——————————————————————
int Utf8_To_Unicode(WCHAR * Unicode,int Unicode_SIze,char * Utf8)
{
int Unicode_Length;
if(Utf8 == NULL || Unicode == NULL )
return 0;
// UTF-8 轉 Unicode
Unicode_Length = MultiByteToWideChar(CP_UTF8, NULL, Utf8, strlen(Utf8), Unicode, Unicode_SIze);
Unicode[Unicode_Length] = NULL;
return Unicode_Length;
}
//——————————————————————
// UTF-8 轉 Unicode
//Utf8:UTF-8字符輸出
//Utf8_Size:UTF-8碼輸出緩衝區BYTE的長度
//Unicode:Unicode寬字符輸入
//返回值:Unicode所占字節數!
//——————————————————————
int Unicode_To_Utf8(char * Utf8,int Utf8_Size,WCHAR * Unicode)
{
int Utf8_Length;
if(Utf8 == NULL || Unicode == NULL)
return 0;
// UTF-8 轉 Unicode
Utf8_Length = WideCharToMultiByte(CP_UTF8, NULL, Unicode, wcslen(Unicode), Utf8, Utf8_Size, NULL, NULL);
Utf8[Utf8_Length] = NULL;
return Utf8_Length;
}
//—————————————————————————
//Ansi 轉 Utf8
//Utf8:UTF-8字符輸出
//Utf8_Size:UTF-8碼輸出緩衝區BYTE的長度
//Ansi:ANSI文本輸入
//Encode:ANSI文本字符編碼
//返回值:Utf8字節長度
//—————————————————————————
int Ansi_To_Utf8(char * Utf8,int Utf8_Size,char * Ansi,int Encode)
{
int Utf8_Length = NULL;
PWORD Unicode;
int Unicode_Size;
int Unicode_Length;
Unicode = (PWORD)Utf8;
Unicode_Size = Utf8_Size/2;
// Ansi 轉 Unicode
//Unicode_Length = Ansi_To_Unicode(Unicode,Unicode_Size,Ansi,Encode);
Unicode_Length = MultiByteToWideChar(Encode, NULL, Ansi,strlen(Ansi), Unicode, Unicode_Size);// 轉換
Unicode[Unicode_Length] = 0;
// Unicode 轉 Utf8
//Utf8_Length = ::Unicode_To_Utf8(Utf8,Utf8_Size,Unicode);
Utf8_Length = WideCharToMultiByte(CP_UTF8, NULL, Unicode, wcslen(Unicode), Utf8, Utf8_Size, NULL, NULL);
Utf8[Utf8_Length] = NULL;
return Utf8_Length;
}
//—————————————————————————
// Utf8 轉換 Ansi
// Ansi: ANSI文本輸出
// Ansi_Size:ANSI碼輸出緩衝區BYTE的長度
// Utf8: UTF-8字符輸入
// 返回值:Ansi字節長度
//—————————————————————————
int Utf8_To_Ansi(char * Ansi,int Ansi_Size,char * Utf8)
{
int Ansi_Length = NULL;
PWORD Unicode;
int Unicode_Size;
int Unicode_Length;
Unicode = (PWORD)Ansi;
Unicode_Size = Ansi_Size/2;
// Utf8 轉 Unicode
//Unicode_Length = Utf8_To_Unicode(Unicode,Unicode_Size,Utf8);
Unicode_Length = MultiByteToWideChar(CP_UTF8, NULL, Utf8, strlen(Utf8), Unicode, Unicode_Size);
Unicode[Unicode_Length] = NULL;
// Unicode 轉 Ansi
//Ansi_Length = ::Unicode_To_Ansi(Ansi,Ansi_Size,Unicode);
Ansi_Length = WideCharToMultiByte(CP_ACP, NULL, Unicode, wcslen(Unicode), Ansi, Ansi_Size, NULL, NULL);
Ansi[Ansi_Length] = NULL;
return Ansi_Length;
}
編碼類型 |
數值 |
說明 |
CP_ACP |
0 |
默認ANSI代碼頁 |
CP_OEMCP |
1 |
默認OEM代碼頁 |
CP_MACCP |
2 |
默認MAC代碼頁 |
CP_THREAD_ACP |
3 |
本線程ANSI代碼頁 |
CP_SYMBOL |
42 |
SYMBOL轉換 |
CP_UTF7 |
65000 |
UTF-7轉換 |
CP_UTF8 |
65001 |
UTF-8轉換 |
CP_ANSI |
1252 |
通用ANSI 代碼頁 |
ISO_8859_1 |
28591 |
西歐語言 |
ARABIC |
1256 |
阿拉伯語 |
GENERAL |
1252 |
通用 |
DUTCH |
1252 |
荷蘭,德國 |
CZECH |
1250 |
捷克斯洛伐克 |
HUNGARIAN |
1250 |
匈牙利 |
ICELANDIC |
1252 |
冰島 |
NORDIC |
1252 |
北歐日耳曼民族的 |
NORWDAN |
1252 |
|
POLISH |
1250 |
波蘭 |
CYRILLIC |
1251 |
西裏爾字母 |
SPANISH |
1252 |
西班牙 |
SWEDFIN |
1252 |
|
TURKISH |
1254 |
土耳其語, 突厥語族 |
GREEK |
1253 |
希臘 |
HEBREW |
1255 |
希伯來語 |
JAPANESE |
932 |
日本 |
KOREAN |
949 |
朝鮮 |
BIG5 |
950 |
正體中文 |
GB2312 |
936 |
簡體中文 |
GBK |
936 |
簡體中文 |
GB18030 |
54936 |
簡體中文 |
SLOVENIAN |
1250 |
未開發 |
你必須登入才能發表留言。