头文件区域设置中声明了两个便利界面:std::wstring_convert
和std::wbuffer_convert
。但是,没有使用示例。
是否有任何简明的例子来说明它们的用法和差异?
答案 0 :(得分:7)
std::wstring_convert
给定std::u32string
(又名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);
请注意,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
(a.k.a std::basic_ostream<char>
)的一个实例,它需要UTF-8编码的文本。所以例如out << u8"Hello"
应该可以正常工作。尽管如此,你有很多UTF-32编码的宽字符串(该作业的最佳候选者是std::u32string
)来自你程序中的其他地方,你需要传递给{{1} }。您可以反复使用out
,但这可能会很快变老。
这是另一种方式:
std::wstring_convert
也就是说,我们可以获得std::wbuffer<std::codecvt_utf8<char32_t>, char32_t> wout { out.rdbuf() };
std::u32string input = U"Hello";
wout << input;
的视图,其行为就好像它是out
的实例并且需要UTF-32编码的文本,并且我们没有改变语言环境(最后一次)这是第一个便利界面存在的一个重要原因。)
我认为std::basic_stream<char32_t>
是std::wbuffer_convert
的补充,而不是竞争对手。
作为免责声明,因为我没有完成支持这些功能或std::wstring_convert
的实现,所以此处的代码完全未经测试:(。