windows 下 c++ 各字符(char、wchar_t、string、cstring)的转换

50 篇文章 2 订阅
23 篇文章 2 订阅

c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串.好像在c++11两者没有区别了

std::string、std::wstring的关系
①:std::string内部是char单字节字符
②:std::wstring内部是WCHAR宽字符,即wchar_t

在MFC的工程中我们可以设置工程的编码属性:
①:对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符  即wchar_t
②:对于多字节的编码属性CString被定义为CStringA,其内部是char单字节字符


字符串的ASCII和UNICODE之间的转换
1)Win32提供了API函数MultiByteToWideChar和WideCharToMultiByte来提供这种功能。
2)ATL还提供了另一套转换宏——CA2W、CA2T、CA2WEX、CA2CT、CW2T、CW2A、CW2AWX
CW2A将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W就是将多字符集(ASCII)转化为宽字符集(Unicode)


所以,自己推测的,在mfc的UNICODE的编码
1.string.c_str() 得到char*
2.wstring.c_str() 得到wchar*

char []转char *:直接进行赋值即可
char str[] = "lala";
char *str1 = str;

char *转char[]:字符拷贝实现,不能进行赋值操作
char *st = "hehe";
char st1[] = "lalalala";
strncpy(st1, st, strlen(st) + 1); // 注意加1操作

string 转 char*  :c_str()    使用str.c_str()返回的是const char* 类型,如果想转换为char* 类型需经过const_cast<char*>()
string str11 = "hello";
const char *p1 = str11.c_str();  //注意必须加上const,不然编译不过
或者char *st1 = const_cast<char *>(str11.c_str());

char *转string:
1)直接赋值;
const char *st = "hello";
string st1 = st;
//注意,定义char *变量,并直接赋值,最好定义为const变量,否则编译器警告
2)构造转换实现
const char *st = "hello";
string s1(st, st + strlen(st));

char []转string:
1)直接赋值;
char st[] = "hello";
string st1 = st;
2)构造转换实现
string st2(st, st + strlen(st));

string转char[]:拷贝实现,不能直接赋值。即string不能直接转换为char[],可以先转换为char*,再通过strcpy来转换
string ts = "My test1";
char ts1[] = "lalallalalaaaa";
strncpy_s(ts1, ts.c_str(), ts.length() + 1); // 注意,一定要加1,否则没有赋值'\0'

同理:wchar_t* 、wchar_t[] 、wstring 互转参考上面的
wstring 转wchar_t*   c_str()    使用str.c_str()返回的是const wchar_t* 类型,如果想转换为wchar_t* 类型需经过const_cast<wchar_t*>()
    std::wstring test5 = L"中文";
    const wchar_t* test8 = test5.c_str();
    wchar_t* test9 = const_cast<wchar_t*> (test5.c_str());

wchar_t *转 char *  和 char * 转 wchar_t*
方法一:利用Windows的宏W2A,A2W
    USES_CONVERSION;
    char* test1 = W2A(L"我是宽字节");//转化成默认
    wchar_t* test12 = A2W("我是窄字节");
方法二:利用Windows里的ATL里面的类CW2A和CA2W
CW2A将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W就是将多字符集(ASCII)转化为宽字符集(Unicode)
    std::string  test3 = CW2A(L"中文字符", CP_UTF8);//一般可以加一下第二个参数,顺便切换编码
    std::wstring test4 = CA2W("中文字符");//一般不用加第二个参数
方法三:利用Windows API中的函数 WideCharToMultiByte 和 MultiByteToWideChar 
    wchar_t * char2wchar(const char* cchar, size_t m_encode = CP_ACP)
    {     
        wchar_t *m_wchar;    
        int len = MultiByteToWideChar( m_encode ,0,cchar ,strlen( cchar), NULL,0);     
        m_wchar= new wchar_t[len+1];     
        MultiByteToWideChar( m_encode ,0,cchar,strlen( cchar),m_wchar,len);     
        m_wchar[len]= '\0' ;    
        return m_wchar;
    }
    char * wchar2char(const wchar_t* wchar ,size_t m_encode = CP_ACP)
    {
        char * m_char;    
        int len= WideCharToMultiByte( m_encode ,0,wchar ,wcslen( wchar ), NULL,0, NULL ,NULL );    
        m_char= new char[len+1];     
        WideCharToMultiByte( m_encode ,0,wp ,wcslen( wchar ),m_char,len, NULL ,NULL );     
        m_char[len]= '\0';     
        return m_char;
    }

所以string 和wstring 互转  参考   wchar_t *互转 char * 
std::wstring test16 = L"中文字符";
std::string  test17 = CW2A(test16.c_str());

wstring 转 cstring    c_str()
std::wstring test5 = L"中文";
CString strtest5 = test5.c_str();


cstring 转 wstring
方法一:GetString() 只读
    CString strtest5 = _T("中文");
    std::wstring test6 = strtest5.GetString();
方法二:GetBuffer() 读写 需要ReleaseBuffer()配合一起
    CString strtest5 = _T("中文");
    std::wstring test7 = strtest5.GetBuffer();
    strtest5.ReleaseBuffer();


cstring 转 wchar_t*     GetBuffer 和ReleaseBuffer
    CString strtest5 = _T("中文");
    const wchar_t* test10 = strtest5.GetBuffer();
    strtest5.ReleaseBuffer();


cstring 转 wchar_t[]   字符拷贝实现,不能进行赋值操作
    CString strtest5 = _T("中文");
    wchar_t test11[8] = {0};
    wcscpy_s(test11, strtest5.GetBuffer());
    strtest5.ReleaseBuffer();


wchar_t[]  转 cstring   直接赋值;
    wchar_t test13[8] = L"中文";
    CString strtest12 = test13;


wchar_*  转 cstring    直接赋值;
    wchar_t* test14 = L"中文";
    CString strtest15 = test14;    

char*、char*[]、string 转cstring  分ASCII和UNICODE两种编码格式
1.ASCII或者说是多字节   直接赋值或者是format
  string -> CString :
      std::string  test18 = "hell0";
    CString strtest19;
    strtest19.Format(_T("%s"), test18.c_str());
    CString strtest20;
    strtest20 = test18.c_str();
2.UNICODE或者说是宽字节   参考 char * 转 wchar_t*   不能直接赋值,同时考虑中文乱码问题。
  如有中文,最好使用 MultiByteToWideChar 
  
cstring  转char*、char*[]、string  分ASCII和UNICODE两种编码格式
1.ASCII或者说是多字节
 CString -> string :
 办法一:GetBuffer  //GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
    CString str11 = "123";
    char *t1 = str11.GetBuffer();
    str11.ReleaseBuffer();
办法二:(LPSTR)(LPCSTR)
    CString str1 = "123";
    char *p = (LPSTR)(LPCSTR)str1;
2.UNICODE或者说是宽字节   参考 wchar_t*  转 char *   不能直接赋值,同时考虑中文乱码问题。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值