c++ WString与String互转的几种方法,容易出现因电脑地域环境而改变导致偶然性bug问题

宽字符转窄字符时候,简单测试没问题,但大批量运行的时候,往往容易出现意想不到的bug,经过多次跟踪调试,发现几个问题,经处理后,运行稳定,分享给大家,希望用上,尤其大批量调用的时候,无后顾之忧。

string WString2String(const std::wstring& ws)
{    
    //1这个方法,容易出现因电脑地域环境而改变,结果很多未知
    /*std::string strLocale = setlocale(LC_ALL, "");
    const wchar_t* wchSrc = ws.c_str();
    size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1;
    char* chDest = new char[nDestSize]();
    memset(chDest, 0, nDestSize);
    wcstombs(chDest, wchSrc, nDestSize);
    std::string strResult = chDest;
    delete[]chDest;
    chDest = NULL;
    setlocale(LC_ALL, strLocale.c_str());
    return strResult;*/

    //2用下列方法时,在ChineseEmojiToUnicodeEmojiString内部转换时不完整,导致信息无法收到
    /*int nwstrlen = WideCharToMultiByte(CP_ACP, 0, ws.c_str(), -1, NULL, 0, NULL, NULL);
    if (nwstrlen > 0)
    {
        std::string str(nwstrlen, '\0');
        WideCharToMultiByte(CP_ACP, 0, ws.c_str(), -1, (LPSTR)str.c_str(), nwstrlen, NULL, NULL);
        return std::move(str);
    }
    return ("");*/

    //3.这个方法目前很稳定,比例处理没问题
    std::string res;
    int len = WideCharToMultiByte(CP_ACP, 0, ws.c_str(), ws.size(), nullptr, 0, nullptr, nullptr);
    if (len <= 0) {
        return res;
    }
    char* buffer = new char[len + 1];
    if (buffer == nullptr) {
        return res;
    }
    WideCharToMultiByte(CP_ACP, 0, ws.c_str(), ws.size(), buffer, len, nullptr, nullptr);
    buffer[len] = '\0';
    res.append(buffer);
    delete[] buffer;
    buffer = NULL;
    return res;

}

wstring String2WString(const std::string& s)
{
    //这个方法不稳定,有时候出现乱码
    //std::string strLocale = setlocale(LC_ALL, "");
    //const char* chSrc = s.c_str();
    //size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;
    //if (nDestSize > 0)
    //{
    //    wchar_t* wchDest = new wchar_t[nDestSize]();//初始化为空
    //    //如果这个时候再用下面初始化,会容易产生意想不到的异常
    //    //wmemset(wchDest, 0, nDestSize);
    //    mbstowcs(wchDest, chSrc, nDestSize);
    //    std::wstring wstrResult = wchDest;
    //    delete[]wchDest;
    //    wchDest = NULL;
    //    setlocale(LC_ALL, strLocale.c_str());
    //    return wstrResult;
    //}
    //return L"";

    std::wstring res;
    int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), nullptr, 0);
    if (len < 0) {
        return res;
    }
    wchar_t* buffer = new wchar_t[len + 1];
    if (buffer == nullptr) {
        return res;
    }
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), buffer, len);
    buffer[len] = '\0';
    res.append(buffer);
    delete[] buffer;
    buffer = NULL;
    return res;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值