c++ - std::wstring_convert 和 std::wbuffer_convert 有什么区别?

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

在头文件 locale 中声明了两个方便的接口(interface):std::wstring_convertstd::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_convertstd::wstring_convert 互补而不是竞争对手。

作为免责声明,因为我还没有接触到支持这些功能或 <codecvt> 的实现。 ,这里的代码完全未经测试:(。

关于c++ - std::wstring_convert 和 std::wbuffer_convert 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14806550/

相关文章:

ruby-on-rails - 如何替换 Ruby 中带重音的拉丁字符?

Dynamic_cast 的 C++ 安全替代方案

C++ 大值左移

c++ - 在传递给 std::result_of 之前衰减类型

string - 使用 strings.Builder 安全地将字节写入 UTF-8 字符?

python - 有没有更快的方法来清除文件中的控制字符?

java - java中的Unicode到String但很棘手

c++ - 如何将 boost local_date_time 转换为 time_t

c++ - 在 C++ 中声明常量时使用字符串值作为宽字符串

python - 如何检查一个字符串是否包含 python 中字母表的所有字母?