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));

  • 相关阅读:
    C/C++程序内存的分配
    【解题报告】UVA101 The Blocks Problem
    洗牌算法
    【持续更新】算法竞赛常用模板
    北京邮电大学2021乐理公共选修课期末考试
    Oracle通用大数据量存储过程分页修正版
    (转)NHibernate 3.0在PetShop 3层架构中的应用
    Json.Net学习笔记
    JS获得浏览器高度和宽度参数
    jQuery数组处理汇总
  • 原文地址:https://www.cnblogs.com/myitm/p/2109765.html
Copyright © 2011-2022 走看看