zoukankan      html  css  js  c++  java
  • 构造UTF8的std::string

    在VC++的世界里,MS比较鼓励使用_UNICODE,std::wstring。而在Web, XML则提倡用UTF8。当在C++的程序里要保存/读取XML数据,就存在wstring与string之间的转换。C++11里提供方便的转换工具(参照:std::wstring_convert处理UTF8 )

    有人说,MS引入_UNICODE就是个错误,STL引入wstring也是个错误;而鼓励使用UTF8 string做为程序内部string存储格式。在与GUI交互的时候,转换为wstring(假定GUI使用的是_UNICODE)。这样做至少有一个好处:相对的可以减少程序运行时占用内存的大小。当然现在内存资源也不是个什么大问题,我更关心的是保存/读取XML数据的效率。

    VC++默认构造std::string的时候是ANSI格式,如
    std::string nstr = "123,我是谁?我爱十八大!";   

    为了构造个UTF8的string,总不能这样写吧
    inline std::string ToUTF8(const wchar_t* wideStr)
    {
       std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
       return conv.to_bytes(wideStr);
    }

    std::string nstr = ToUTF8(L"123,我是谁?我爱十八大!");

    这样写能Work,但总感觉有问题。

    VC++ 2008 SP1提供了个编译选项,可以默认就构造出UTF8的string,不需要上述转换。
    #pragma execution_character_set("utf-8") 

    这样string就是utf8。
    那wstring的编码格式会变吗?若变,会变成啥呢?
    std::wstring str = L"123,我是谁?";

    另外C++11定义了u8,类似L
      std::string nstr = u8"123,我是谁?";
    但VS2010SP1并不支持。

    注:
    以上说的都是VC++的事儿。而Clang,据说默认就是utf8(有待验证)。
    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    项目打包文件build.xml
    【转】常见面试之机器学习算法思想简单梳理
    【转】11位机器学习大牛最爱算法全解
    Simplify Path
    Text Justification
    Valid Number
    Substring with Concatenation of All Words
    Shortest Palindrome
    Palindrome Pairs
    Decode Ways
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5834855.html
Copyright © 2011-2022 走看看