WideCharToMultiByte和MultiByteToWideChar函數

來源:互聯網
上載者:User

http://hi.baidu.com/magicfuzzx/item/e5fd6a954c0a3aae82d29531

//將unicode字串轉換為多位元組字串

int WideCharToMultiByte(

  UINT CodePage, //字碼頁,一般為CP_ACP

  DWORD dwFlags, //額外標記,一般為0

  LPCWSTR lpWideCharStr, //unicode字串

  int cchWideChar, //unicode字串的大小,(-1)為函數自己判斷

  LPSTR lpMultiByteStr, //ANSI字串的緩衝區,必須指定大小

  int cbMultiByte, //ANSI字串緩衝區的大小(注意為0的意思)

  LPCSTR lpDefaultChar, //一般為NULL,不能轉化的時候使用參數改指定的字元

  LPBOOL lpUsedDefaultChar //轉換成功為FALSE,失敗為TRUE

);

cbMultiByteStr:如果該參數為0的話,那麼函數的作用就是返回需要的緩衝區的大小,而前面的lpMutliByteStr參數就可以為NULL(因為已經失去了意義)。

CodePage:要與新轉換的字串關聯的字碼頁。

dwFlags:允許我們指定額外的轉換控制,這些標誌會影響帶變音符號的字元和系統不能轉化的字元,但我們一般不需要進行這種程度的轉換控制,而直接賦值為0

lpWideCharStr:指向將被轉換的unicode字串。

cchWideChar:指定由參數lpWideCharStr指向的緩衝區的字元個數。如果這個值為-1,字串將被設定為以NULL為結束符的字串,並且自動計算長度。

lpMultiByteStr:指向接收被轉換字串的緩衝區。

cchMultiByte:指定由參數lpMultiByteStr指向的緩衝區最大值(用位元組來計量)。若此值為零,函數返回lpMultiByteStr指向的目標緩衝區所必需的位元組數,在這種情況下,lpMultiByteStr參數通常為NULL。

 

lpDefaultChar和pfUsedDefaultChar:只有當WideCharToMultiByte函數遇到一個寬位元組字元,而該字元在uCodePage參數標識的字碼頁中並沒有它的標記法時,WideCharToMultiByte函數才使用這兩個參數。如果寬位元組字元不能被轉換,該函數便使用lpDefaultChar參數指向的字元。如果該參數是NULL(這是大多數情況下的參數值),那麼該函數使用系統的預設字元。該預設字元通常是個問號。這對於檔案名稱來說是危險的,因為問號是個萬用字元。pfUsedDefaultChar參數指向一個布爾變數,如果Unicode字串中至少有一個字元不能轉換成等價多位元組字元,那麼函數就將該變數置為TRUE。如果所有字元均被成功地轉換,那麼該函數就將該變數置為FALSE。當函數返回以便檢查寬位元組字串是否被成功地轉換後,可以測試該變數。這兩個參數基本上被設定為NULL。

 

  傳回值:如果函數運行成功,並且cchMultiByte不為零,傳回值是由lpMultiByteStr指向的緩衝區中寫入的位元組數;如果函數運行成功,並且cchMultiByte為零,傳回值是接收到待轉換字串的緩衝區所必需的位元組數。如果函數運行失敗,傳回值為零。若想獲得更多錯誤資訊,請調用GetLastError函數。它可以返回下面所列錯誤碼:

ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;

ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。

 

//將多位元組字串轉換為uniode字串

int MultiByteToWideChar(

  UINT CodePage,

  DWORD dwFlags,

  LPCSTR lpMultiByteStr,

  int cbMultiByte,

  LPWSTR lpWideCharStr,

  int cchWideChar

);

參數跟WideCharToMultiByte一致就是少了最後兩個參數。

 

使用例子:

LPWSTRlpHello = L"Hello World";

/*擷取所需要的緩衝區的大小*/

UINT  nBufferSize;

nBufferSize = WideCharToMultiByte(CP_ACP,0,lpHello,-1,NULL,0,NULL,NULL);

/*申請需要的緩衝區*/

LPSTRlpTarget;

lpTarget = (LPSTR)HeapAlloc(GetProcessHeap(),0,sizeof(char) * nBufferSize);

/*正式轉換*/

WideCharToMultiByte(CP_ACP,0,lpHello,-1,lpTarget,nBufferSize,NULL,NULL);

//do something-_-

/*釋放所緩衝區*/

HeapFree(GetProcessHeap(),0,lpTarget);

 

//比這樣寫要好看多了

LPWSTRlpHello = L"Hello World";

CHARszBuf[MAX_PATH];

memset(szBuf,0,sizeof(szBuf));

WideCharToMultiByte(CP_ACP,0,lpHello,(int)wcslen(lpHello),szBuf,sizeof(szBuf),NULL,NULL);

cout<<szBuf<<endl;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.