因為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 | 未開發 |