UNICODE串轉換成char類型串的四種方法


 

1. 調用 WideCharToMultiByte() API

int WideCharToMultiByte (
    UINT    CodePage,                //1 Unicode編碼的字符頁,Unicode編碼有字符頁的概念,比如gb2312/936,big5/950等
    DWORD   dwFlags,                //2 如何處理復合unicode字符,詳細查google
    LPCWSTR lpWideCharStr,        //3 待轉換的unicode串
    int     cchWideChar,                //4 表示參數3的長度  傳遞-1表示以0x00結尾
    LPSTR   lpMultiByteStr,            //5 接受轉換后的串的字符緩沖
    int     cbMultiByte,                    //6 表示參數5lpMutiByteStr的字節大小 通常sizeof一下
    LPCSTR  lpDefaultChar,        //7 NULL 具體google
    LPBOOL  lpUsedDefaultChar//8 NULL 具體google
);

2. 調用CRT函數wcstombs()

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

3. 使用CString構造器或賦值操作

// 假設有一個Unicode串wszSomeString

CString str1 ( wszSomeString ); // 用構造器轉換
CString str2;

str2 = wszSomeString; // 用賦值操作轉換

4. 使用ATL串轉換宏

#include <atlconv.h>

// 還是假設有一個Unicode串wszSomeString

{
    char szANSIString [MAX_PATH];
    USES_CONVERSION; // 聲明這個宏要使用的局部變量

    lstrcpy ( szANSIString, OLE2A(wszSomeString) );
}

 

 

隨筆- 45  文章- 98  評論- 24 

 

為了支持Unicode編碼,需要多字節與寬字節之間的相互轉換。這兩個系統函數在使用時需要指定代碼頁,在實際應用過程中遇到亂碼問題,然后重新閱讀《Windows核心編程》,總結出正確的用法。
WideCharToMultiByte的代碼頁用來標記與新轉換的字符串相關的代碼頁。
MultiByteToWideChar的代碼頁用來標記與一個多字節字符串相關的代碼頁。
常用的代碼頁由CP_ACP和CP_UTF8兩個。
使用CP_ACP代碼頁就實現了ANSIUnicode之間的轉換。
使用CP_UTF8代碼頁就實現了UTF-8Unicode之間的轉換。
下面是代碼實現:
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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM