string和wstring的转化

经常会遇到字符集的转化,char到wchar_t,string与wstring相互转化。而且还要考虑到跨平台。

    #include<string>  
    using namespace std;  
      
    //将string转换成wstring  
    wstring string2wstring(string str)  
    {  
        wstring result;  
        //获取缓冲区大小,并申请空间,缓冲区大小按字符计算  
        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';             //添加字符串结尾  
        //删除缓冲区并返回值  
        result.append(buffer);  
        delete[] buffer;  
        return result;  
    }  
      
    //将wstring转换成string  
    string wstring2string(wstring wstr)  
    {  
        string result;  
        //获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的  
        int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);  
        char* buffer = new char[len + 1];  
        //宽字节编码转换成多字节编码  
        WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);  
        buffer[len] = '\0';  
        //删除缓冲区并返回值  
        result.append(buffer);  
        delete[] buffer;  
        return result;  
    }  

 

参考:字符串转换Unicode下wstring(wchar_t*)和string(char*)互相转换

一、string 转 wstring:

1.

string source; 
wstring target(source.begin() ,source.end());

这种转换对中文不支持,慎用。

2.调用MultiByteToWideChar():

//Converting a Ansi string to WChar string
std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
 
{
          int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
          if(nSize <= 0) return NULL;
 
          WCHAR *pwszDst = new WCHAR[nSize+1];
          if( NULL == pwszDst) return NULL;
 
          MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
          pwszDst[nSize] = 0;
 
          if( pwszDst[0] == 0xFEFF)                    // skip Oxfeff
          for(int i = 0; i < nSize; i ++) 
          pwszDst[i] = pwszDst[i+1]; 
 
          wstring wcharString(pwszDst);
          delete pwszDst;
 
          return wcharString;
}

参考:Linux下string和wstring的转换

1.源码实现

#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <wchar.h>
#include <locale.h>

using namespace std;

int ws2s(const wstring &ws, string &r)
{
    const wchar_t *source = ws.c_str();
    char *dest = NULL;
    int len = 0;
    int ret = 0;

    len = wcslen(source) + 1;

    if(len <= 1)
        return 0;

    dest = new char[len*sizeof(wchar_t)];

    ret = wcstombs(dest, source, len*sizeof(wchar_t));

    r = string(dest);

    delete[] dest;

    return ret;
}

int s2ws(const string &s, wstring &r)
{
    const char *source = s.c_str();
    wchar_t *dest = NULL;
    int len = 0;
    int ret = 0;

    len = strlen(source) + 1;

    if(len <= 1)
        return 0;

    dest = new wchar_t[len];

    ret = mbstowcs(dest, source, len);

    r = wstring(dest);

    delete[] dest;

    return ret;
}

int main()
{
    string a("你好,世界");
    wstring b;
    string c;

    setlocale(LC_CTYPE, "zh_CN.utf8");

    s2ws(a, b);
    ws2s(b, c);

    cout << c << endl;

    return 0;
}

2.编译源码

 

$ g++ -o example example.cpp

3.运行及其结果

 

$ ./example
你好,世界

参考:linux c++中string和wstring互转

 

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值