zoukankan      html  css  js  c++  java
  • Unicode下CString(wchar_t)转换为 char*

    wstring MultCHarToWideChar(string str)
    {
        //获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的
        int len=MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),NULL,0);
        TCHAR *buffer=new TCHAR[len+1];
        //多字节编码转换成宽字节编码
        MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),buffer,len);
        buffer[len]='/0';//添加字符串结尾
        //删除缓冲区并返回值
        wstring return_value;
        return_value.append(buffer);
        delete []buffer;
        return return_value;
    }
    string WideCharToMultiChar(wstring str)
    {
        string return_value;
        //获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的
        int len=WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),NULL,0,NULL,NULL);
        char *buffer=new char[len+1];
        WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL);
        buffer[len]='/0';
        //删除缓冲区并返回值
        return_value.append(buffer);
        delete []buffer;
        return return_value;
    }

    于是使用
    string mstring = WideCharToMultiChar( (LPCTSTR)mCString );
    strcpy_s( pach, sizeof(pach), mstring.c_str() );

    void ConvertUnicodeToAscii(const CString &csFilestr, char* pszData)
    {
        
    int iFileLength = csFilestr.GetLength();
        
    char * szBuff;
        szBuff 
    = new char[iFileLength*sizeof(TCHAR)+sizeof(TCHAR)];

    #if !defined (_WIN32_WCE) && !defined(_UNICODE)
        strcpy(szBuff,(LPCTSTR)csFilestr);
    #else
        iFileLength 
    = WideCharToMultiByte(CP_OEMCP,
            WC_COMPOSITECHECK,
            csFilestr,
            iFileLength,
            szBuff,
            iFileLength
    *sizeof(TCHAR)+sizeof(TCHAR),
            NULL,NULL);
    #endif
        szBuff[iFileLength] 
    = '/0';
        strcpy(pszData, szBuff);

        delete[] szBuff;
        szBuff 
    = NULL;
    }
    ★在UNICODE下,同样的CString str= "str"会报错误的!!! 

    应该是:CString str = L"str"; 
    或者 CString str = _T("str"); 

    ★ANSI中CString 里面的串类型相当于 char * 
    UNICODE里面的却相当于: WCHAR * 

    ★UNICODE下的CString 事实上是CStringW 
    ANSI下的CString 事实上是CStringA,只不过使用宏CString隐藏了

    CString 是一种很特殊的 C++ 对象,它里面包含了三个值:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数(它是不可存取的,是位于 
    CString 地址之下的一个隐藏区域)以及一个缓冲区长度。 
    有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL字符)。字符记数和缓冲区长度被巧妙隐藏。

    CString ,BSTR ,LPCTSTR之间关系和区别

    CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。

                                  CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
                                  typedef OLECHAR FAR* BSTR;
                                  typedef const char * LPCTSTR;

                                  vc++中各种字符串的表示法
                                  首先char* 
                                  是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
                                  LP的含义是长指针(long 
                                  pointer)。LPSTR是一个指向以‘/0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
                                  而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
                                  1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.
                                  2.C表示const
                                  3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.
                                  为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
                                  LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
                                  然后为了实现两种编码的通用,提出了TCHAR的定义:
                                  如果定义_UNICODE,声明如下:
                                  typedef wchar_t TCHAR;
                                  如果没有定义_UNICODE,则声明如下:
                                  typedef char TCHAR;
                                  LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
                                  CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
                                  LPCTSTR:
                                       #ifdef _UNICODE
                                          typedef const wchar_t * LPCTSTR;
                                       #else
                                          typedef const char * LPCTSTR;
                                       #endif
                                  VC常用数据类型使用转换详解

    单宽字节互换的程序,估计以后还用得着。
    void MyWideCharToMultiByte(WCHAR* wchars,CHAR* schars,int scharsLen) 
      {
            memset(schars,0,scharsLen);
            CString m_snd = wchars;
            int len = m_snd.GetLength();
            CString tmpstr(m_snd); //复制要发送的字符串
            int multibytelen=WideCharToMultiByte( //计算从Unicode转换到Ansi后需要的字节数
            CP_ACP, //根据ANSI code page转换
            WC_COMPOSITECHECK | WC_DEFAULTCHAR, //转换出错用缺省字符代替
            (LPCWSTR)tmpstr.GetBuffer(len), //要转换的字符串地址
                    len, //要转换的个数
                    0, //转换后字符串放置的地址
                    0, //最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节
                    0, //缺省的字符:"/0"
                    0 //缺省的设置
             );
            WideCharToMultiByte( //转换Unicode到Ansi
                    CP_ACP,
                    WC_COMPOSITECHECK | WC_DEFAULTCHAR,
                    (LPCWSTR)tmpstr.GetBuffer(len),
                    len,
                    (char *)schars, //转换到缓冲区中
                    scharsLen, //最多个字节
                    0,
                    0
              );
      }
    //程序接收到的字符串最后保存到CString tmpstr中. 
      //接收函数片断
      void MyMultiByteToWideChar(char* schars,CString &wstr) 
      {
            // TODO: Add your specialized code here and/or call the base class
    //      char * p = "abcdefg我是谁hijk";
            int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数
                    CP_ACP,
                    MB_COMPOSITE,
                    (char*)schars, //要转换的Ansi字符串
                    -1, //自动计算长度
                    0,
                    0
            );
            CString tmpstr;
            tmpstr.GetBuffer(widecharlen); //为转换后保存Unicode字符串分配内存
            MultiByteToWideChar( //从Ansi转换到Unicode字符
                    CP_ACP,
                    MB_COMPOSITE,
                    (char*)schars,
                    -1,
                    (LPWSTR)tmpstr.GetBuffer(widecharlen), //转换到tmpstr
                    widecharlen //最多转换widecharlen个Unicode字符
            );
            wstr = tmpstr;
      }

    void TestFunction()
    {
        TCHAR abc[]=_T("ab我们的家ab");
        char b[15];
        MyWideCharToMultiByte(abc,b,sizeof(b));
        
    //    char c[]="ab如果cd就好了!abcdefg";
        CString str;
        MyMultiByteToWideChar(b,str);

        MyWideCharToMultiByte((LPWSTR)str.GetBuffer(0),b,sizeof(b));

  • 相关阅读:
    B.Icebound and Sequence
    Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS
    Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
    Educational Codeforces Round 65 (Rated for Div. 2) B. Lost Numbers
    Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number
    Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
    Codeforces Round #561 (Div. 2) B. All the Vowels Please
    Codeforces Round #561 (Div. 2) A. Silent Classroom
    HDU-2119-Matrix(最大匹配)
    读书的感想!
  • 原文地址:https://www.cnblogs.com/myitm/p/2109765.html
Copyright © 2011-2022 走看看