std :: wstring_convert和std :: wbuffer_convert之间有什么区别?

时间:2013-02-11 05:45:10

标签: c++ string unicode character-encoding c++11

头文件区域设置中声明了两个便利界面:std::wstring_convertstd::wbuffer_convert。但是,没有使用示例。

是否有任何简明的例子来说明它们的用法和差异?

1 个答案:

答案 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的实现,所以此处的代码完全未经测试:(。