在头文件 locale 中声明了两个便利接口:std::wstring_convert
和std::wbuffer_convert
. 但是,没有使用示例。
有没有简洁的例子来说明它们的用法和区别?
在头文件 locale 中声明了两个便利接口:std::wstring_convert
和std::wbuffer_convert
. 但是,没有使用示例。
有没有简洁的例子来说明它们的用法和区别?
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>
,这里的代码完全未经测试:(。