1. 程式人生 > >[收集]ANSI字元與Unicode字元的互相轉換

[收集]ANSI字元與Unicode字元的互相轉換

二、雙位元組字串轉單位元組字串(比如LPWSTR轉char*、wstring|wchar_t*轉換為string|char*)
//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表示呼叫失敗