[收集]ANSI字元與Unicode字元的互相轉換
阿新 • • 發佈:2019-01-10
二、雙位元組字串轉單位元組字串(比如LPWSTR轉char*、wstring|wchar_t*轉換為string|char*)
附MultiByteToWideChar函式與WideCharToMultiByte函式引數說明:
(1) MultiByteToWideChar
函式原型:
引數說明:
1:CodePage
指定執行轉換的字符集,這個引數可以為系統已安裝或有效的任何字符集所給定的值。你也可以指定其為下面的任意一值:
2:dwFlags
一組位標記用以指出是否未轉換成預作或寬字元(若組合形式存在),是否使用象形文字替代控制字元,以及如何處理無效字元。你可以指定下面是標記常量的組合,含義如下:
函式的預設動作是轉換成預作的形式。如果預作的形式不存在,函式將嘗試轉換成組合形式。
標記MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而標記MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS則不管其它標記如何都可以設定。
3:lpMultiByteStr
指向將被轉換字串的字元。
4:cchMultiByte
指定由引數lpMultiByteStr指向的字串中位元組的個數。如果lpMultiByteStr指定的字串以空字元終止,可以設定為-1(如果字串不是以空字元中止,設定為-1可能失敗,可能成功),此引數設定為0函式將失敗。
5:lpWideCharStr
指向接收被轉換字串的緩衝區。
6:cchWideChar
指定由引數lpWideCharStr指向的緩衝區的位元組數。若此值為零,函式返回緩衝區所必需的寬字元數,在這種情況下,lpWideCharStr中的緩衝區不被使用。
返回值
如果函式執行成功,並且cchWideChar不為零,返回值是由lpWideCharStr指向的緩衝區中寫入的寬字元數;如果函式執行成功,並且cchMultiByte為零,返回值是接收到待轉換字串的緩衝區所需求的寬字元數大小。如果函式執行失敗,返回值為零。若想獲得更多錯誤資訊,請呼叫GetLastError函式。它可以返回下面所列錯誤程式碼:
(2) WideCharToMultiByte
函式原型:
引數說明:
1、CodePage
指定要轉換成的字符集內碼表,它可以是任何已經安裝的或系統自帶的字符集,可以選擇以下的內碼表:
2、dwFlags
指定如何處理沒有轉換的字元,一般情況下設為0
//wstring轉換為string: string ConverWStringToString(wstring wstr) { int size=WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,NULL,0,NULL,NULL); char *ch=new char[size+1]; if(!WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,ch,size,NULL,NULL)) { return false; } string str=ch; delete []ch; return str; }
//wchar_t*轉換為char*:
char* ConverPWCharToPChar(wchar_t *wch)
{
int size=WideCharToMultiByte(CP_ACP,0,wch,-1,NULL,0,NULL,NULL);
char *ch=new char[size+1];
if(!WideCharToMultiByte(CP_ACP,0,wch,-1,ch,size,NULL,NULL))
{
return false;
}
return ch;
}
附MultiByteToWideChar函式與WideCharToMultiByte函式引數說明:
(1) MultiByteToWideChar
函式原型:
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
引數說明:
1:CodePage
指定執行轉換的字符集,這個引數可以為系統已安裝或有效的任何字符集所給定的值。你也可以指定其為下面的任意一值:
CP_ACP:ANSI字符集;CP_MACCP:Macintosh內碼表;CP_OEMCP:OEM內碼表; CP_SYMBOL:符號字符集(42);CP_THREAD_ACP:當前執行緒ANSI內碼表; CP_UTF7:使用UTF-7轉換;CP_UTF8:使用UTF-8轉換。
2:dwFlags
一組位標記用以指出是否未轉換成預作或寬字元(若組合形式存在),是否使用象形文字替代控制字元,以及如何處理無效字元。你可以指定下面是標記常量的組合,含義如下:
MB_PRECOMPOSED:通常使用預作字元——就是說,由一個基本字元和一個非空字元組成的字元只有一個單一的字元值。這是預設的轉換選擇。不能與
MB_COMPOSITE值一起使用。
MB_COMPOSITE:通常使用組合字元——就是說,由一個基本字元和一個非空字元組成的字元分別有不同的字元值。不能與MB_PRECOMPOSED值一起使用。
MB_ERR_INVALID_CHARS:如果函式遇到無效的輸入字元,它將執行失敗,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。
MB_USEGLYPHCHARS:使用象形文字替代控制字元。
組合字元由一個基礎字元和一個非空字元構成,每一個都有不同的字元值。每個預作字元都有單一的字元值給基礎/非空字元的組成。在字元è中,e就是基礎字元,而重音符標記就是非空字元。函式的預設動作是轉換成預作的形式。如果預作的形式不存在,函式將嘗試轉換成組合形式。
標記MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而標記MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS則不管其它標記如何都可以設定。
3:lpMultiByteStr
指向將被轉換字串的字元。
4:cchMultiByte
指定由引數lpMultiByteStr指向的字串中位元組的個數。如果lpMultiByteStr指定的字串以空字元終止,可以設定為-1(如果字串不是以空字元中止,設定為-1可能失敗,可能成功),此引數設定為0函式將失敗。
5:lpWideCharStr
指向接收被轉換字串的緩衝區。
6:cchWideChar
指定由引數lpWideCharStr指向的緩衝區的位元組數。若此值為零,函式返回緩衝區所必需的寬字元數,在這種情況下,lpWideCharStr中的緩衝區不被使用。
返回值
如果函式執行成功,並且cchWideChar不為零,返回值是由lpWideCharStr指向的緩衝區中寫入的寬字元數;如果函式執行成功,並且cchMultiByte為零,返回值是接收到待轉換字串的緩衝區所需求的寬字元數大小。如果函式執行失敗,返回值為零。若想獲得更多錯誤資訊,請呼叫GetLastError函式。它可以返回下面所列錯誤程式碼:
ERROR_INSUFFICIENT_BUFFER;ERROR_INVALID_FLAGS;
ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION
(2) WideCharToMultiByte
函式原型:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
引數說明:
1、CodePage
指定要轉換成的字符集內碼表,它可以是任何已經安裝的或系統自帶的字符集,可以選擇以下的內碼表:
CP_ACP //當前系統ANSI內碼表
CP_MACCP //當前系統Macintosh內碼表
CP_OEMCP //當前系統OEM內碼表,一種原始裝置製造商硬體掃描碼
CP_SYMBOL //Symbol內碼表,用於Windows 2000及以後版本
CP_THREAD_ACP //當前執行緒ANSI內碼表,用於Windows 2000及以後版本
CP_UTF7 //UTF-7,設定此值時lpDefaultChar和lpUsedDefaultChar都必須為NULL
CP_UTF8 //UTF-8,設定此值時lpDefaultChar和lpUsedDefaultChar都必須為NULL
2、dwFlags
指定如何處理沒有轉換的字元,一般情況下設為0
WC_NO_BEST_FIT_CHARS //把不能直接轉換成相應多位元組字元的Unicode字元轉換成lpDefaultChar指定的預設字元。
WC_COMPOSITECHECK //把合成字元轉換成預製的字元。它可以與後三個選項中的任何一個組合使用,如果沒有與他們中的任何一個組合,則與選項WC_SEPCHARS相同。
WC_ERR_INVALID_CHARS //此選項會致使函式遇到無效字元時失敗返回,並且GetLastError會返回錯誤碼ERROR_NO_UNICODE_TRANSLATION。否則函式會自動丟棄非法字元。此選項只能用於UTF8
WC_DISCARDNS //轉換時丟棄不佔空間的字元,與WC_COMPOSITECHECK一起使用
WC_SEPCHARS //轉換時產生單獨的字元,此是預設轉換選項,與WC_COMPOSITECHECK一起使用
WC_DEFAULTCHAR //轉換時使用預設字元代替例外的字元,(最常見的如"?"),與WC_COMPOSITECHECK一起使用
3、lpWideCharStr //要轉換的寬字串
4、cchWideChar //要轉換寬字串的長度,-1表示轉換到字串結尾
5、lpMultiByteStr //接收轉換後輸出的字串的緩衝區
6、cbMultiByte //輸出緩衝區大小,如果為0,lpMultiByteStr將被忽略,函式將返回所需緩衝區大小而不使用lpMultiByteStr。
7、lpDefaultChar //指向字元的指標,在指定編碼裡找不到相應字元時使用此字元作為預設字元代替,如果為NULL則使用系統預設字元
8、lpUsedDefaultChar //開關變數的指標,用以表明是否使用過預設字元,可設為NULL
返回值:為0表示呼叫失敗