6

在头文件 locale 中声明了两个便利接口:std::wstring_convertstd::wbuffer_convert. 但是,没有使用示例。

有没有简洁的例子来说明它们的用法和区别?

4

1 回答 1

8

std::wstring_convert

给定一个std::u32string(aka std::basic_string<char32_t>),它以元素的形式保存 UTF-32 代码单元,以下char32_t是如何将其转换为字节形式的 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);

请注意, is 的一个怪癖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;

也就是说,我们可以看到它的out行为就好像它是std::basic_stream<char32_t>UTF-32 编码文本的一个实例,并且我们没有改变语言环境(最后一点是这些便利接口首先存在的一个重要原因)。

我想这std::wbuffer_convert是对竞争对手的补充,std::wstring_convert而不是竞争对手。

作为免责声明,因为我还没有着手实现支持这些功能中的任何一个,或者<codecvt>,这里的代码完全未经测试:(。

于 2013-02-11T07:48:27.337 回答