c++ 编码理解

c++ 编码理解,

STD::WCOUT输出到console,以及从string到Wstring转换理解。
直接上代码吧
有时间再来整理。

// convert string to wstring
std::wstring str_to_wstring(const std::string &str, const std::locale &loc = std::locale())
{
    std::vector<wchar_t> buf(str.size());
    std::use_facet<std::ctype<wchar_t>>(loc).widen(str.data(),
                                                   str.data() + str.size(),
                                                   buf.data());
    return std::wstring(buf.data(), buf.size());
}


std::wstring s2ws(const std::string& str)
{
    using convert_typeX = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_typeX, wchar_t> converterX;
 
    return converterX.from_bytes(str);
}
 
std::string ws2s(const std::wstring& wstr)
{
    using convert_typeX = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_typeX, wchar_t> converterX;
 
    return converterX.to_bytes(wstr);
}

static const int kTextSize = 10;
bool FormatText(std::string* txt) {
  if (NULL == txt) {
    return false;
  }
  std::cout << "before:" << *txt << std::endl;
  std::wstring w_txt = s2ws(*txt);
  std::cout << "wstring size:" << w_txt.size() << std::endl;
  std::cout << "string size:" << (*txt).size() << std::endl;
  if (w_txt.size() > kTextSize) {
    w_txt = w_txt.substr(0, kTextSize);
    *txt = ws2s(w_txt);
    *txt += "...";
  }
  std::cout << "after:" << *txt << std::endl;
  return true;
}



// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.from_bytes(str);
}

void main()
{
    ROS_INFO_STREAM("begin testcode!!!");
    if(false)
    {
        assert(L"" == s2ws(""));

        std::string txt = "龙之谷app好玩等你";
        assert(24 == txt.size());
        std::wstring w_txt = s2ws(txt);
        assert(10 == w_txt.size());

        assert("" == ws2s(L""));

        w_txt = L"龙之谷app好玩等你";
        assert(10 == w_txt.size());
        txt = ws2s(w_txt);
        assert(24 == txt.size());

        txt = "龙之谷app公测开启";
        std::string format_txt = txt;
        FormatText(&format_txt);
        assert(txt == format_txt);

        txt = "龙之谷app公测火爆开启";
        FormatText(&txt);
        format_txt = "龙之谷app公测火爆...";
        assert(format_txt == txt);

        return;
    }

    {//test
        // setlocale(LC_ALL, ".936");
        std::string str("");
        stringstream ss;
        const char* pD = str.c_str();
        for(int i=0; i < str.size(); ++i){
            uint8_t ui = pD[i];
            int x = ui * 1;
            ss << "data[" <<i << "]:" << std::hex << (uint)ui << "-";
        }
        wstring wstr = s2ws(str);
        std::wstring wstr1 = L"黄";
        std::wcout.sync_with_stdio(false);
        std::wcout.imbue(std::locale("en_US.utf8"));
        std::wcout  << L"w:"<< wstr << L"-" << wstr1 << std::endl;


        return;

        bool bResult = false;
        peripheral_device_ftp::VehicleNumber l_srv;

        if(m_pltNumSrvClient.call(l_srv)){
            if(l_srv.response.ImagePath.empty()){
                ROS_WARN_STREAM(" Service return empty path:" << l_srv.response.ImagePath);
            }
            else{
                // ROS_INFO_STREAM("plate num:" << l_srv.response.VehicleNumber << ", path:" << l_srv.response.ImagePath);
                // plateNum = l_srv.response.VehicleNumber;
                string oriFileName = l_srv.response.ImagePath; 
            }
        }
        return;
    }
}

(http://www.cplusplus.com/forum/beginner/126557/)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值