MultiByteToWideCharとWideChar ToMultiByteの使い方を詳しく説明します。

16092 ワード


この記事の転載は以下の通りですhttp://blog.csdn.net/norains/article/details/1461174
 
//====================================================================================================================================    MultiByteToWideCharとWideChar ToMultiByteの使い方の詳細/AUTHOR:/    norans//DATE://    第一版:Monday  25-December-2006//    増補版:Wednesday 27-December-2006/    改訂版:Wednesday 14-March-2007(修正前のエラー例)/    再度改訂版:Tuesday 18-September-2007(修正コードのパラメータエラー)
//    再改訂版:Friday 02-April-2009(修正記事の例の誤り)//Evironment:/  EVC 4.0+Standard SDK/===========================================================================================================================  1.使い方の詳細  ここでは、まず短い文字と広い文字とは何かを簡単に説明します。  短い文字とは、8 bitで表される文字のことです。典型的なアプリケーションはASCIIコードです。広い文字は16 bitで表される文字です。典型的にはUNICODEがあります。windowsのASCIIとUNCODEの詳細については、この二つの古典的な著作を参照してください。この2冊の本はこの2種類の文字について比較的に詳しい解説があります。    広い文字を複数の短い文字に変換するのは難しいですが、そのコツを会得すれば、魚のように水を得ることができます。  じゃ、始めましょう。 
 1   //                :  

 2   char sText[20] = {"      !OK!"};

 3  

 4   //                      .         ,          20       

 5   //(       ,        10  ;  ,       ,   20 。         ),               .

 6   //           ,          ,                    .

 7   //                                   .

 8   //  ,              .

 9   //      MultiByteToWideChar()        -1,                 :

10   DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);

11  

12   //   ,              :

13   wchar_t *pwText;

14   pwText = new wchar_t[dwNum];

15   if(!pwText)

16   {

17    delete []pwText;

18   }

19  

20   //  ,            .       ASCII     :

21   MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);

22  

23   //  ,                :

24   delete []pwText;

25  

26  

27   //  ,               :  

28   wchar_t wText[20] = {L"       !OK!"};

29   DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);

30   char *psText;

31   psText = new char[dwNum];

32   if(!psText)

33   {

34    delete []psText;

35   }

36   WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);

37   delete []psText;
   前にスペースを割り当てましたが、文字列が短いので、無駄なスペースを気にせずに、短い文字と広い文字を簡単に変換したいだけです。何か簡便な方法がありますか?   WIN 32 APIにはこのような要求に該当する関数がありませんが、自分でカプセル化できます。
 1      

 2   //-------------------------------------------------------------------------------------

 3   //Description:

 4   // This function maps a character string to a wide-character (Unicode) string

 5   //

 6   //Parameters:

 7   // lpcszStr: [in] Pointer to the character string to be converted

 8   // lpwszStr: [out] Pointer to a buffer that receives the translated string.

 9   // dwSize: [in] Size of the buffer

10   //

11   //Return Values:

12   // TRUE: Succeed

13   // FALSE: Failed

14   //

15   //Example:

16   // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));

17   //---------------------------------------------------------------------------------------

18   BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)

19   {

20     // Get the required size of the buffer that receives the Unicode

21     // string.

22     DWORD dwMinSize;

23     dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);

24  

25     if(dwSize < dwMinSize)

26     {

27      return FALSE;

28     }

29  

30     

31     // Convert headers from ASCII to Unicode.

32     MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  

33     return TRUE;

34   }

35  

36   //-------------------------------------------------------------------------------------

37   //Description:

38   // This function maps a wide-character string to a new character string

39   //

40   //Parameters:

41   // lpcwszStr: [in] Pointer to the character string to be converted

42   // lpszStr: [out] Pointer to a buffer that receives the translated string.

43   // dwSize: [in] Size of the buffer

44   //

45   //Return Values:

46   // TRUE: Succeed

47   // FALSE: Failed

48   //

49   //Example:

50   // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));

51   //---------------------------------------------------------------------------------------

52   BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)

53   {

54    DWORD dwMinSize;

55    dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);

56    if(dwSize < dwMinSize)

57    {

58     return FALSE;

59    }

60    WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);

61    return TRUE;

62   }

63  

64  

65   //        ,    :

66   wchar_t wText[10] = {L"    "};

67   char sText[20]= {0};

68   WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));

69   MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));
 
    この2つの関数の欠点は、メモリを動的に割り当てることができず、長い文字列を変換するとメモリ空間が無駄になります。スペースの無駄を考えずに短い文字列を変換するのが便利なのが利点です。  2.MultiByteToWideChar関数の文字化けの問題  ある友達は標準WinCE 4.2またはWinCE 5.0 SDKシミュレータの下で、この関数は正常に動作しないことを発見したかもしれません。その変換後の文字は全部文字化けです。MultiByteToWideChar()パラメータを直ちに変更しても同じです。  しかし、これはコードの問題ではありません。その結症はカスタマイズされたオペレーティングシステムにあります。もし私たちが注文したオペレーティングシステムのデフォルトの言語が中国語ではないなら、このような場合もあります。標準のSDKデフォルトの言語は英語なので、この問題が必ず発生します。この問題の解決は、コントロールパネルの「地域オプション」の「デフォルト言語」を簡単に変更することができません。システムをカスタマイズするときは、デフォルトの言語を「中国語」とします。  システムカスタマイズ時に標準言語の位置を選択します。  Platform->Setting...->locale->default langageは、「中国語」を選択してコンパイルすればいいです。