zoukankan      html  css  js  c++  java
  • VC++中通过MultiByteToWideChar将string|char*转换为wstring|wchar_t*

    将string|char*转换为wstring|wchar_t*的例子:
    1、string转换为wstring:
    string str=_T("翔翔糖糖");
    int size=MultiByteToWideChar(CP_ACP,0,str.c_str(),-1,NULL,0);
    wchar_t *ch=new wchar_t[size+1];
    if(!MultiByteToWideChar(CP_ACP,0,str.c_str(),-1,ch,size))
    { return false;}

    wstring wstr=ch;
    2、char*转换为wchar_t*:
    char *str=_T("翔翔糖糖");
    int size=MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);
    wchar_t *ch=new wchar_t[size+1];
    if(!MultiByteToWideChar(CP_ACP,0,str,-1,ch,size))
    { return false;}
    MultiByteToWideChar使用例子 
    char* OleDBCom::UnsignedShortToCharp(unsigned short *strU)

    UINT nStrULength=WideCharToMultiByte(
    CP_ACP,0,strU,-1,NULL,NULL,NULL,NULL);
    LPSTR lpStr;
    lpStr=(char*)malloc(nStrULength); 
    WideCharToMultiByte(CP_ACP,0,strU,-1,lpStr,nStrULength,NULL,NULL);
    return lpStr;
    }
    unsigned short* OleDBCom::CharpToUnsignedShort(LPSTR str)
    {
    OLECHAR strU[255];
    int nStatus=MultiByteToWideChar(CP_ACP,0,str,-1,strU,255); 
    return strU;
    }
    ====================
    HRESULT __fastcall AnsiToUnicode(LPCSTR pszA, LPOLESTR* ppszW)
    {
       ULONG cCharacters;
       DWORD dwError;
       if (NULL == pszA)
       {
         *ppszW = NULL;
         return NOERROR;
       }
       cCharacters = strlen(pszA)+1;
       *ppszW = (LPOLESTR) CoTaskMemAlloc(cCharacters*2);
       if (NULL == *ppszW)
         return E_OUTOFMEMORY;
       if (0 == MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters,
           *ppszW, cCharacters))
       {
         dwError = GetLastError();
         CoTaskMemFree(*ppszW);
         *ppszW = NULL;
         return HRESULT_FROM_WIN32(dwError);
       }
    return NOERROR;
    这里有个例子,
    PWSTR pWideCharStr;
    int nLenOfWideCharStr;
    首先计算需要的宽字符串的字符数
    nLenOfWideCharStr=MultiByteToWideChar(CP_ACP,0,pMultiByteStr,-1,NULL,0)
    这里的pMultiByteStr是要转换的多字节字符。
    给pWideCharStr分配内存块
    pWideCharStr=HeapAlloc(GetProcessHeap(),0,nLenOfWideCharStr*sizeof(WCHAR));
    然后把多字节字符串转换成宽字符串
    MultiByteToWideChar(CP_ACP,0,pMultiByteStr,-1,pWideCharStr,nLenOfWideCharStr)

    WideCharToMultiByte和MultiByteToWideChar函数的用法
    为了支持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    ]; 
    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;
    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;
    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;


    #include "stdafx.h" 
    #include "string.h" 
    #include "stdio.h" 
    #include "windows.h" 
    int main(int argc, char* argv[]) 

    char temp[20]; 
    int nLen; 
    LPWSTR name = L"CPU"; 
    sprintf(temp,"CPU%02d",i); 
    nLen = MultiByteToWideChar(CP_ACP,0,temp,-1,NULL,0); 
    MultiByteToWideChar(CP_ACP,0,temp,-1,(LPWSTR)name,nLen); 
    WideCharToMultiByte(CP_ACP,0,(LPWSTR)name,-1, strs,100,NULL,NULL); 
    printf("good: %s \n",name); 
    return 0; 

    调试时,在MultiByteToWideChar处报错 
    MultiByteToWideChar 函数把一个字符串映射为一个宽字符串。被这个函数映射的字符串不必属于多字节字符集。 

        返回值: 
    若该函数成功,且 cchMultiByte 为非零值,则返回值是写入由 lpWideCharStr 指向的缓冲区中的宽字符数。

    若该函数成功,且 cchMultiByte 为零,则返回值是以宽字符为单位的缓冲区大小值。该缓冲区可以接收转换后的字符串。 
    若该函数失败,则返回值为FALSE,调用GetLastErro可获得补充的错误信息。 


    1   //--------------------------------------------------------------------------- 
       //函数输入Big5字符,返回Gb简体字符   //两次转换
        //--------------------------------------------------------------------------- 
        AnsiString __fastcall Big2Gb(AnsiString sBig) 
        { 
        char* pszBig5=NULL; //Big5编码的字符 
        wchar_t* wszUnicode=NULL; //Unicode编码的字符 
        char* pszGbt=NULL; //Gb编码的繁体字符 
        char* pszGbs=NULL; //Gb编码的简体字符 
        AnsiString sGb; //返回的字符串 
        int iLen=0; //需要转换的字符数 
        pszBig5=sBig.c_str(); //读入需要转换的字符参数 
        //计算转换的字符数 
        iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0) ; 
        //给wszUnicode分配内存 
        wszUnicode=new wchar_t[iLen+1]; 
        //转换Big5码到Unicode码,使用了API函数MultiByteToWideChar 
        MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen); 
         //计算转换的字符数 
        iLen=WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ; 
        //给pszGbt分配内存 
        pszGbt=new char[iLen+1]; 
        //给pszGbs分配内存 
        pszGbs=new char[iLen+1]; 
        //转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte 
        WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ; 
        //转换Gb码繁体到Gb码简体,使用API函数LCMapString 
        LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen); 
        //返回Gb码简体字符 
        sGb=pszGbs; 
        //释放内存 
        delete [] wszUnicode; 
        delete [] pszGbt; 
        delete [] pszGbs; 
        return sGb; 
        } 
    2   //--------------------------------------------------------------------------- 
    //函数输入Gb字符,返回Big5字符    //两次转换
        //--------------------------------------------------------------------------- 
        AnsiString __fastcall Gb2Big(AnsiString sGb) 
        { 
        char* pszGbt=NULL; //Gb编码的繁体字符 
        char* pszGbs=NULL; //Gb编码的简体字符 
        wchar_t* wszUnicode=NULL; //Unicode编码的字符 
        char* pszBig5=NULL; //Big5编码的字符 
        AnsiString sBig5; //返回的字符串 
        int iLen=0; //需要转换的字符数 
        pszGbs=sGb.c_str(); //读入需要转换的字符参数 
        //计算转换的字符数 
        iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0) ; 
        //给pszGbt分配内存 
        pszGbt=new char[iLen*2+1]; 
        //转换Gb码简体到Gb码繁体,使用API函数LCMapString 
    LCMapString(0) 
    要确保是在unicode环境下,才可使用WideCharToMultiByte

  • 相关阅读:
    关于互联网产品经理的认知
    互联网产品经理的工作职责
    软件需求分析方法
    Enumeration遍历http请求参数的一个例子
    jquery datatable使用简单示例
    改变输出的文字的字体格式
    excel 类获取起始列和使用列
    调试不能命中断点
    CString转换为const char*
    __declspec(dllexport)
  • 原文地址:https://www.cnblogs.com/qq78292959/p/2077015.html
Copyright © 2011-2022 走看看