zoukankan      html  css  js  c++  java
  • WideCharToMultiByte和MultiByteToWideChar函数的用法(转载)

    出处:http://www.cnblogs.com/gakusei/articles/1585211.html

    为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
    WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
    MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
    常用的代码页由CP_ACP和CP_UTF8两个。
    使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
    使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
    下面是代码实现:

    1.  ANSI to Unicode

     1 wstring ANSIToUnicode( const string& str )
     2 {
     3  int  len = 0;
     4  len = str.length();
     5  int  unicodeLen = ::MultiByteToWideChar( CP_ACP,
     6             0,
     7             str.c_str(),
     8             -1,
     9             NULL,
    10             0 ); 
    11  wchar_t *  pUnicode; 
    12  pUnicode = new  wchar_t[unicodeLen+1]; 
    13  memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 
    14  ::MultiByteToWideChar( CP_ACP,
    15          0,
    16          str.c_str(),
    17          -1,
    18          (LPWSTR)pUnicode,
    19          unicodeLen ); 
    20  wstring  rt; 
    21  rt = ( wchar_t* )pUnicode;
    22  delete[]  pUnicode;
    23  
    24  return  rt; 
    25 }

    2.  Unicode to ANSI

     1 string UnicodeToANSI( const wstring& str )
     2 {
     3  char*     pElementText;
     4  int    iTextLen;
     5  // wide char to multi char
     6  iTextLen = WideCharToMultiByte( CP_ACP,
     7          0,
     8          str.c_str(),
     9          -1,
    10          NULL,
    11          0,
    12          NULL,
    13          NULL );
    14  pElementText = new char[iTextLen + 1];
    15  memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
    16  ::WideCharToMultiByte( CP_ACP,
    17          0,
    18          str.c_str(),
    19          -1,
    20          pElementText,
    21          iTextLen,
    22          NULL,
    23          NULL );
    24  string strText;
    25  strText = pElementText;
    26  delete[] pElementText;
    27  return strText;
    28 }

    3.  UTF-8 to Unicode

     1 wstring UTF8ToUnicode( const string& str )
     2 {
     3  int  len = 0;
     4  len = str.length();
     5  int  unicodeLen = ::MultiByteToWideChar( CP_UTF8,
     6             0,
     7             str.c_str(),
     8             -1,
     9             NULL,
    10             0 ); 
    11  wchar_t *  pUnicode; 
    12  pUnicode = new  wchar_t[unicodeLen+1]; 
    13  memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 
    14  ::MultiByteToWideChar( CP_UTF8,
    15          0,
    16          str.c_str(),
    17          -1,
    18          (LPWSTR)pUnicode,
    19          unicodeLen ); 
    20  wstring  rt; 
    21  rt = ( wchar_t* )pUnicode;
    22  delete[]  pUnicode;
    23  
    24  return  rt; 
    25 }

    4.  Unicode to UTF-8

     1 string UnicodeToUTF8( const wstring& str )
     2 {
     3  char*     pElementText;
     4  int    iTextLen;
     5  // wide char to multi char
     6  iTextLen = WideCharToMultiByte( CP_UTF8,
     7          0,
     8          str.c_str(),
     9          -1,
    10          NULL,
    11          0,
    12          NULL,
    13          NULL );
    14  pElementText = new char[iTextLen + 1];
    15  memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
    16  ::WideCharToMultiByte( CP_UTF8,
    17          0,
    18          str.c_str(),
    19          -1,
    20          pElementText,
    21          iTextLen,
    22          NULL,
    23          NULL );
    24  string strText;
    25  strText = pElementText;
    26  delete[] pElementText;
    27  return strText;
    28 }
  • 相关阅读:
    orm 锁 和 事务
    多表查询
    django 单表查询
    djgango装饰器
    几个SQL命令的使用
    怎么成为优秀的软件模型设计者?
    jbpm 工作流(二)
    Jbpm工作流(一)
    EJB 介绍
    JNDI 使用
  • 原文地址:https://www.cnblogs.com/chechen/p/3862899.html
Copyright © 2011-2022 走看看