在头文件 locale 中声明了两个方便的接口(interface):std::wstring_convert
和 std::wbuffer_convert
。但是,没有使用示例。
有没有简明的例子说明它们的用法和区别?
最佳答案
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>
-- 它有一个 protected 析构函数。
std::wbuffer_convert
这是一个令人信服的用例:您有一个 out
对象,它是 std::ostream
的一个实例(又名 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
的 View 表现得好像它是 std::basic_stream<char32_t>
的一个实例并且需要 UTF-32 编码的文本,并且我们没有更改区域设置(最后一点是这些便利接口(interface)首先存在的一个重要原因)。
我想 std::wbuffer_convert
与 std::wstring_convert
互补而不是竞争对手。
作为免责声明,因为我还没有接触到支持这些功能或 <codecvt>
的实现。 ,这里的代码完全未经测试:(。
关于c++ - std::wstring_convert 和 std::wbuffer_convert 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14806550/