Windows之ANSI和UNICODE與UTF8相互轉換

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

 

 

 

評論