Windows之ANSI和UNICODE與UTF8相互轉換
因為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
未開發
你必須登入才能發表留言。