c++ char、wchar_t互换

char *和wchar_t *的相互转换,

1.将使用标准C的mbstowcs方法和wcstombs方法

且配合标准C的setlocale方法,这也是利用标准库跨平台的做法,但是过程没法直接转成自定义的编码,需要额外转码。所以在Windows平台开发的话不推荐。

size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count)和

size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count)

char*转换为wchar_t*   即多字符转宽字符

用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法:

char *CStr = "string to convert";

size_t len = strlen(CStr) + 1;

size_t converted = 0;

wchar_t *WStr;

WStr=(wchar_t*)malloc(len*sizeof(wchar_t));

mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);

其结果是WStr中储存了CStr的wchar_t版本。

wchar_t*转换为char*    即宽字符转多字符:

和上面的方法类似,用stdlib.h中的wcstombs_s函数,例子:

wchar_t *WStr = L"string to convert";

size_t len = wcslen(WStr) + 1;

size_t converted = 0;

char *CStr;

CStr=(char*)malloc(len*sizeof(char));

wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);

这时WStr中的内容将被转化为char版本储存在CStr中。

在windows 下 wchar_t 转 char也就是编码转化

2.利用Windows API中的函数 WideCharToMultiByte 和 MultiByteToWideChar ,而且也是可以带自定义编码转换

这两个系统函数都在<windows.h>中

char*转换为wchar_t* 

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

wchar_t*转换为char*

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

3.利用Windows的宏W2A,A2W

    USES_CONVERSION;
    char* test1 = W2A(L"我是宽字节");//转化成默认
    wchar_t* test12 = A2W("我是窄字节");

4.利用Windows里的ATL里面的类CW2A和CA2W,在转换时候还可以顺便调整编码,不加第二个参数就是保持GBK不变

    std::string test3 = CW2A(L"中文字符", CP_UTF8);//一般可以加一下第二个参数,顺便切换编码
    std::wstring test4 = CA2W("中文字符");//一般不用加第二个参数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值