1. 程式人生 > >程式道 -Learning, Thinking and Coding <儲存知識的金庫>

程式道 -Learning, Thinking and Coding <儲存知識的金庫>

1.用於多位元組字串轉換成UNICODE字串

int
WINAPI
MultiByteToWideChar(
    __in UINT     CodePage,
    __in DWORD    dwFlags,
    __in_bcount(cbMultiByte) LPCSTR   lpMultiByteStr,
    __in int      cbMultiByte,
    __out_ecount_opt(cchWideChar) __transfer(lpMultiByteStr) LPWSTR  lpWideCharStr,
    __in int      cchWideChar);

函式功能:將一個多位元組的字串轉換成UNICODE字串

引數說明:

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轉換。 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則不管其它標記如何都可以設定。 lpMultiByteStr:指向將被轉換字串的字元。 cchMultiByte:指定由引數lpMultiByteStr指向的字串中位元組的個數。如果lpMultiByteStr指定的字串以空字元終止,可以設定為-1(如果字串不是以空字元中止,設定為-1可能失敗,可能成功),此引數設定為0函式將失敗。 lpWideCharStr:指向接收被轉換字串的緩衝區。 cchWideChar:指定由引數lpWideCharStr指向的緩衝區的寬字元個數。若此值為零,函式返回緩衝區所必需的寬字元數,在這種情況下,lpWideCharStr中的緩衝區不被使用。

返回值:

如果函式執行成功,並且cchWideChar不為零,返回值是由lpWideCharStr指向的緩衝區中寫入的寬字元數;如果函式執行成功,並且cchWideChar為零,返回值是接收到待轉換字串的緩衝區所需求的寬字元數大小。如果函式執行失敗,返回值為零。若想獲得更多錯誤資訊,請呼叫GetLastError函式。它可以返回下面所列錯誤程式碼: ERROR_INSUFFICIENT_BUFFER;ERROR_INVALID_FLAGS; ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。
注意: 指標lpMultiByteStr和lpWideCharStr必須不一樣。如果一樣,函式將失敗,GetLastError將返回ERROR_INVALID_PARAMETER的值。 如果MB_ERR_INVALID_CHARS被設定並且在資源字串中遇到無效的字元時,函式將失敗。如果MB_ERR_INVALID_CHARS不被設定,或是DBCS串中發現了頭位元組而沒有有效的尾位元組,無效字元將轉換為預設字元,但不是資源字串中的預設字元。當無效字元被發現,且MB_ERR_INVALID_CHARS值被設定,函式返回零,GetLastErro顯示ERROR_NO_UNICODE_TRANSLATION的出錯資訊。 如果cbhMultiByte為-1,需要注意返回值為包括零字元在內的字串的總長度比求字元長度函式得到的返回值大1。 Windows CE:不支援引數CodePage中的CP_UTF7和CP_UTF8的值,以及引數dwFlags中的WC_NO_BEST_FIT_CHARS值。 直接上程式碼:
#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
	char bytes[]="HelloWorld";
	int WideCharLen=MultiByteToWideChar(CP_ACP,0,bytes,-1,NULL,0); //獲取 待轉換字串的緩衝區所需求的寬字元數大小,包括'\0'(因為第四個引數設定為-1)

	wchar_t *pwstr=new wchar_t[WideCharLen]; //分配WideCharLen大小的空間用於存放 待轉換的UICODE字串
	wmemset(pwstr,0,WideCharLen);
	
	MultiByteToWideChar(CP_ACP,0,bytes,-1,pwstr,WideCharLen); //將以空字元終止的多位元組字串轉換成UNICODE字串

	wcout<<pwstr<<endl; //輸出該UNICODE字串
	
	delete []pwstr; //釋放空間
	pwstr=NULL; //將pwstr置NULL
	
	return 0;
}
2.用於UNICODE字串轉換成多位元組字串 int
WINAPI
WideCharToMultiByte(
    __in UINT     CodePage,    //指定執行轉換的內碼表
    __in DWORD    dwFlags,   //允許你進行額外的控制,它會影響使用了讀音符號(比如重音)的字元
    __in_ecount(cchWideChar) LPCWSTR  lpWideCharStr, //指定要轉換為寬位元組字串的緩衝區
    __in int      cchWideChar,  //指定由引數lpWideCharStr指向的緩衝區的字元個數(如果lpWideCharStr指定的字串以空字元終止,可以設定為-1
    __out_bcount_opt(cbMultiByte) __transfer(lpWideCharStr) LPSTR   lpMultiByteStr,   //指向接收被轉換字串的緩衝區
    __in int      cbMultiByte,      //指定由引數lpMultiByteStr指向的緩衝區最大值
    __in_opt LPCSTR   lpDefaultChar,             //遇到一個不能轉換的字元,函式便會使用pDefaultChar引數指向的字元
    __out_opt LPBOOL  lpUsedDefaultChar);    //至少有一個字元不能轉換為其多位元組形式,函式就會把這個變數設為TRUE 函式功能:將一個UNICODE字串轉換成多位元組字串       返回值如果函式執行成功,並且cchMultiByte不為零,返回值是由 lpMultiByteStr指向的緩衝區中寫入的位元組數;如果函式執行成功,並且cchMultiByte為零,返回值是接收到待轉換字串的緩衝區所必需的位元組數。如果函式執行失敗,返回值為零。若想獲得更多錯誤資訊,請呼叫GetLastError函式。它可以返回下面所列錯誤程式碼: ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS; ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。 注意:指標lpMultiByteStr和lpWideCharStr必須不一樣。如果一樣,函式將失敗,GetLastError將返回ERROR_INVALID_PARAMETER的值。 
直接上程式碼:
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;

int main()
{	
	wchar_t wstr[]=L"HelloWorld";
	int MultiByteLen=WideCharToMultiByte(CP_ACP,0,wstr,-1,NULL,0,NULL,0); //獲取接收到待轉換字串的緩衝區所需求的位元組數,包括'\0'(因為第四個引數設定為-1)

	char *pbytes=new char[MultiByteLen]; //分配MultiByteLen大小的空間用於存放待轉換的多位元組字串
	memset(pbytes,0,MultiByteLen);

	WideCharToMultiByte(CP_ACP,0,wstr,-1,pbytes,MultiByteLen,NULL,NULL); ////將以空字元終止的UNICODE字串轉換成多位元組的字串
	
	string str=pbytes;
	cout<<str<<endl; //輸出該多位元組 字串
	
	delete pbytes; //釋放空間
	pbytes=NULL; //將pbytes置NULL
	return 0;
}