天天看點

C++多位元組字元轉換為寬字元的兩種方法

目前知道有兩種方式:可以提供寬字元與ANSI字元之間的轉換,

  第一種由COM庫提供的函數

  char*  _com_util::ConvertBSTRToString(BSTR );

  BSTR _com_util::ConvertStringToBSTR(char*);

  Example

  // ConvertBSTRToString.cpp

  #include <comutil.h>

  #include <stdio.h>

  #pragma comment(lib, "comsupp.lib")

  int main()

  {

  BSTR bstrText = ::SysAllocString(L"Test");

  wprintf(L"BSTR text: %s\n", bstrText);

  char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);

  printf("char * text: %s\n", lpszText2);

  SysFreeString(bstrText);

  delete[] lpszText2;

  }

  Output

  BSTR text: Test

  char * text: Test

  第二種标準庫提供的函數

  将寬字元串wcstr轉換為ANSI字元串mbstr

  size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );

  mbstr

  多位元組字元的位址

  wcstr

  寬字元的位址

  count

  可以​​存儲​​在多位元組字元的最大位元組數

  将ANSI字元串mbstr轉化為寬字元串wcstr

  size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count );

  Parameters

  寬字元串的位址

  多位元組字元串(ANSI)的位址

  要轉換的多位元組的字元的個數

  /* MBSTOWCS.CPP illustrates the behavior of the mbstowcs function

  */

  #include <stdlib.h>

  void main( void )

  int i;

  char    *pmbnull  = NULL;

  char    *pmbhello = (char *)malloc( MB_CUR_MAX );

  wchar_t *pwchello = L"Hi";

  wchar_t *pwc      = (wchar_t *)malloc( sizeof( wchar_t ));

  printf( "Convert to multibyte string:\n" );

  i = wcstombs( pmbhello, pwchello, MB_CUR_MAX );

  printf( "\tCharacters converted: %u\n", i );

  printf( "\tHex value of first" );

  printf( " multibyte character: %#.4x\n\n", pmbhello );

  printf( "Convert back to wide-character string:\n" );

  i = mbstowcs( pwc, pmbhello, MB_CUR_MAX );

  printf( " wide character: %#.4x\n\n", pwc );

  delete[] pmbhello;

  delete[] pwc      ;

  //該例子示例摘自msdn,我覺得這裡有記憶體洩漏,是以我加入了

  //最後兩行,應為這裡涉及到動态記憶體配置設定,

  //ms-help://MS.MSDNQTR.2003FEB.2052/wcecrt/htm/_wcecrt_mbstowcs.htm

  Convert to multibyte string:

  Characters converted: 1

  Hex value of first multibyte character: 0x0e1a

  Convert back to wide-character string:

  Hex value of first wide character: 0x0e1e

  用COM庫的函數需要在轉換完後,自己釋放由COM庫給字元串配置設定的記憶體,标準庫提供的函數則要求自己事先非配一個緩存區用來存放,轉換後的字元串.