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
    wstring ANSIToUnicode( const string& str )
    {
     int  len = 0;
     len = str.length();
     int  unicodeLen = ::MultiByteToWideChar( CP_ACP,
                0,
                str.c_str(),
                -1,
                NULL,
                0 );  
     wchar_t *  pUnicode;  
     pUnicode = new  wchar_t[unicodeLen+1];  
     memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
     ::MultiByteToWideChar( CP_ACP,
             0,
             str.c_str(),
             -1,
             (LPWSTR)pUnicode,
             unicodeLen );  
     wstring  rt;  
     rt = ( wchar_t* )pUnicode;
     delete  pUnicode; 
     
     return  rt;  
    }
    2.  Unicode to ANSI
    string UnicodeToANSI( const wstring& str )
    {
     char*     pElementText;
     int    iTextLen;
     // wide char to multi char
     iTextLen = WideCharToMultiByte( CP_ACP,
             0,
             str.c_str(),
             -1,
             NULL,
             0,
    NULL,
             NULL );
     pElementText = new char[iTextLen + 1];
     memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
     ::WideCharToMultiByte( CP_ACP,
             0,
             str.c_str(),
             -1,
             pElementText,
             iTextLen,
             NULL,
             NULL );
     string strText;
     strText = pElementText;
     delete[] pElementText;
     return strText;
    }
    3.  UTF-8 to Unicode
    wstring UTF8ToUnicode( const string& str )
    {
     int  len = 0;
     len = str.length();
     int  unicodeLen = ::MultiByteToWideChar( CP_UTF8,
                0,
                str.c_str(),
                -1,
                NULL,
                0 );  
     wchar_t *  pUnicode;  
     pUnicode = new  wchar_t[unicodeLen+1];  
     memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
     ::MultiByteToWideChar( CP_UTF8,
             0,
             str.c_str(),
             -1,
             (LPWSTR)pUnicode,
             unicodeLen );  
     wstring  rt;  
     rt = ( wchar_t* )pUnicode;
     delete  pUnicode; 
     
     return  rt;  
    }
    4.  Unicode to UTF-8    
    string UnicodeToUTF8( const wstring& str )
    {
     char*     pElementText;
     int    iTextLen;
     // wide char to multi char
     iTextLen = WideCharToMultiByte( CP_UTF8,
             0,
             str.c_str(),
             -1,
             NULL,
             0,
             NULL,
             NULL );
     pElementText = new char[iTextLen + 1];
     memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
     ::WideCharToMultiByte( CP_UTF8,
             0,
             str.c_str(),
             -1,
             pElementText,
             iTextLen,
             NULL,
             NULL );
     string strText;
     strText = pElementText;
     delete[] pElementText;
     return strText;
    }

  • 相关阅读:
    常用的字符集编码
    live555—VS2010/VS2013 下live555编译、使用及测试(转载)
    win32下Socket编程(转载)
    do{...}while(0)的意义和用法(转载)
    C++ static与单例模式
    MFC多线程各种线程用法 .
    a^1+b problem
    重返现世——题解
    第K大C
    懒癌
  • 原文地址:https://www.cnblogs.com/cappuccino/p/2843519.html
Copyright © 2011-2022 走看看