xml*_*lmx 5 c++ string unicode character-encoding c++11
头文件语言环境中声明了两个便利接口:std::wstring_convert和std::wbuffer_convert.但是,没有使用示例.
有没有简洁的例子来说明它们的用法和差异?
std::wstring_convert给定一个std::u32string(aka std::basic_string<char32_t>)以char32_t元素的形式保存UTF-32代码单元,这里是如何将它转换为字节形式的UTF-8代码单元序列:
// Both <locale> and <codecvt> required
std::u32string input = U"Hello, World";
using Codecvt = std::codecvt_utf8<char32_t>;
std::wstring_convert<Codecvt, char32_t> converter;
// throws std::range_error if the conversion fails
std::string result = converter.to_bytes(input);
Run Code Online (Sandbox Code Playgroud)
请注意,一个奇怪的std::wstring_convert是,它始终将标准调用宽字符串(实际上是任何类型的特化std::basic_string,包括std::string)转换为字节字符串或字节字符串,这是表单的特殊化std::basic_string<char, std::char_traits<char>, Allocator>.
源和目标编码将取决于使用的代码转换方面 - 这里我使用的是一个来自的库存方面<codecvt>.只要它是可破坏的,任何代码转换方面都会这样做,但事实并非如此std::codecvt<wchar_t>- 它有一个受保护的析构函数.
std::wbuffer_convert这是一个有希望引人注目的用例:你有一个out对象,它是std::ostream(aka std::basic_ostream<char>)的一个实例,需要UTF-8编码的文本.所以例如out << u8"Hello"应该工作得很好.尽管如此,你有很多UTF-32编码的宽字符串(这个工作的最佳候选者std::u32string)来自你的程序中的其他地方,你需要传递给它out.你可以std::wstring_convert反复使用,但这可以很快变老.
这是另一种方式:
std::wbuffer<std::codecvt_utf8<char32_t>, char32_t> wout { out.rdbuf() };
std::u32string input = U"Hello";
wout << input;
Run Code Online (Sandbox Code Playgroud)
也就是说,我们可以获得一个视图out,就好像它是一个实例std::basic_stream<char32_t>并且需要UTF-32编码的文本,并且我们没有改变语言环境(最后一点是这些便利接口首先存在的一个重要原因) ).
我认为这std::wbuffer_convert是对std::wstring_convert竞争对手的补充,而不是竞争对手.
作为免责声明,因为我没有按照支持这些功能的实现,或者<codecvt>这里的代码完全未经测试:(.