《深入理解C++11》笔记-Unicode编码支持和原生字符串字面量

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/WizardtoH/article/details/81313744

上一篇:《深入理解C++11》笔记-对齐支持和通用属性

这是这本书的最后一部分内容,但是还有一些C++11的特性这本书没有涉及,后面还会继续介绍这些特性。

Unicode编码支持

C++98中为了支持Unicode,定义了宽字符wchar_t。但是wchar_t在各个平台上实现的长度不同,对代码移植有一定的影响。因此,C++11新增了char16_t和char32_t,他们的长度分别为固定的16和32字节。另外,C++11还定义了3个常量字符串前缀,u8代表UTF-8编码,u代表UTF-16编码,U代表UTF-32编码。

编码转换

C++11标准还实现了一些模板类来支持编码转换。
非UTF-8编码宽窄字符转换:

using F = std::codecvt_byname<wchar_t, char, std::mbstate_t> ;

std::wstring string2wstring(const std::string& str, const std::string& locale)
{
    std::wstring_convert<F> strcvt(new F(locale));
    return strcvt.from_bytes(str);
}

std::string wstring2string(const std::wstring& str, const std::string& locale)
{
    std::wstring_convert<F> strcvt(new F(locale));
    return strcvt.to_bytes(str);
}


int main()
{
    std::string str = "你好";
    std::wstring wstr = string2wstring(str, ".936");   // 根据本地实际编码来设置locale,在windows下为.936,代表GB2312

    std::wcout.imbue(std::locale(".936"));             // windows下wcout需要设置编码为GB2312才能正确输出中文
    std::wcout << wstr << std::endl;           // 你好

    wstr = L"嗨";
    str = wstring2string(wstr, ".936");
    std::cout << str << std::endl;                     // 嗨

    return 0;
}

UTF-8编码宽窄字符转换:

std::string wstring2utf8string(const std::wstring& str)
{
    // strcvt中的两个空字符串参数作用是在转换错误时返回空字符串
    // 如果不设置,当传入参数为非UTF-8中文时,会引起程序错误
    std::wstring_convert<std::codecvt_utf8<wchar_t>> strcvt(std::string(""), std::wstring(L""));
    return strcvt.to_bytes(str);
}

std::wstring utf8string2wstring(const std::string& str)
{
    std::wstring_convert< std::codecvt_utf8<wchar_t>> strcvt(std::string(""), std::wstring(L""));
    return strcvt.from_bytes(str);
}

int main()
{
    std::string str = u8"你好";
    std::wstring wstr = utf8string2wstring(str);

    std::wcout.imbue(std::locale(".936"));
    std::wcout << wstr << std::endl;           // 你好

    str = wstring2utf8string(wstr);                   // windows下cout无法输出utf-8编码中文到控制台(使用xcode能够输出)
    wstr = utf8string2wstring(str);                   // 因此重新转换成wstring 验证转换结果
    std::wcout << wstr << std::endl;

    return 0;
}

原生字符串字面量

原生字符串字面量的意思就是所见即所得,在代码中的字符串常量是怎么样的,我们得到的就是怎么样的,不需要转义字符来控制特定的字符。只需要在字符串前面加上前缀R并且用括号将字符串包含即可:

int main()
{
    std::string str = "\"你好\"";
    std::cout << str << std::endl;

    const char* str1 = R"("你好")";
    std::cout << str << std::endl;

    return 0;
}

UTF-8前缀也能一起使用:

int main()
{
    std::string str = u8"\"你好\"";
    std::string str1 = u8R"("你好")";

    return 0;
}

下一篇:《深入应用C++11》笔记-std::function和bind

猜你喜欢

转载自blog.csdn.net/WizardtoH/article/details/81313744