版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/WizardtoH/article/details/81313744
这是这本书的最后一部分内容,但是还有一些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;
}