文档章节

Unicode下CString(wchar_t)转换为 char*

shzwork
 shzwork
发布于 05/11 15:05
字数 1468
阅读 3
收藏 0

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

本文转载自:https://www.cnblogs.com/myitm/archive/2011/07/18/2109765.html

shzwork
粉丝 10
博文 505
码字总数 6494
作品 0
厦门
私信 提问
CString, BSTR, LPCTSTR 概念

CString是一个动态TCHAR数组, BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵 ) LPCTSTR只是一个常量的TCHAR指针。 CString 是一个完全独立的类,动态的TCHAR数组,封装了+等操作符...

AlphaJay
2010/08/27
0
0
VC 编程ANSI环境下读写Unicode文件和将CStdioFile类扩展,读取UNICODE文本文件

VC 编程ANSI环境下读写Unicode文件 没有注意到文件编码的不同会产生这么多的问题,在动手以前查询了很多资料,在本博客中收藏了不少先辈的成果,在这里一并表示致敬! 关于ANSI和Unicode编码...

长平狐
2013/01/06
694
0
CString,string,char数组的转换

虽然网上关于CString,string,char数组的转换的文章一大堆,但是感觉很乱很杂,而且许多并不能真正达到目的,在此,我把自己调试通过的转换方法贴到这里,做个笔记。 编译环境:vs2008, Use...

乐搏学院
2016/12/02
4
0
BSTR、LPSTR、LPWSTR、CString、VAvariant_t、CComBSTR、...

Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多种编程方式,不仅功能强大而且应用广泛。在编程中,我们常常会遇到ANSI、Unicode以及BSTR不同编码类 型的字符串转换操作。本文先介绍基...

mjrao
2012/10/23
0
0
CString,int,string,char*之间的转换

《C++标准函数库》中说的 有三个函数可以将字符串的内容转换为字符数组和C—string 1.data(),返回没有”0“的字符串数组 2,c_str(),返回有”0“的字符串数组 3,copy() .....................

橘子红了呐
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【redis】spring boot利用redis的Keyspace Notifications实现消息通知

前言 需求:当redis中的某个key失效的时候,更新key对应数据在数据库的状态 1、修改redis.conf 安装的redis服务默认是: notify-keyspace-events "",修改成 notify-keyspace-events Ex; 位置...

时刻在奔跑
13分钟前
1
0
IT基础设施中的人工智能可以改变工作的方式

  如今,减少人工智能的宣传和炒作已成为IT领导者的主要工作。提供有关人工智能在何处以及如何将其添加到IT基础设施的深入指南将会提供帮助。   很多技术提供商正在投入巨资,将人工智能...

琴殇的
13分钟前
0
0
vue cli3创建测试打包环境(通过development、production、alpha指定不同的接口地址)

参考地址 前言:项目一般有开发环境,测试环境,生产环境;vue cli内置有开发和生产环境,可以用process.env.NODE_ENV区分,有时候我们和后台同事需要本地连接调试代码,又需要连接测试环境调...

hkaikai
20分钟前
1
0
360安全浏览器龙芯、飞腾、兆芯版

主页https://browser.360.cn/se/linux/ 龙芯 http://down.360safe.com/gc/browser360-cn-stable-10.0.2001.0-1.mips64el.rpm http://down.360safe.com/gc/browser360-cn-stable_10.0.2001.0......

gugudu
20分钟前
41
0
访问JSP时,浏览器显示为

问题: <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param>......

器石_
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部