std::wstring_convert 和 std::wbuffer_convert 有什么区别?
What's the difference between std::wstring_convert and std::wbuffer_convert?
在头文件区域设置中声明了两个方便的接口:std::wstring_convert
和std::wbuffer_convert
。然而,没有使用示例。
有没有简明的例子来说明它们的用法和区别?
std::wstring_convert
给定一个以char32_t
元素形式保存UTF-32代码单元的std::u32string
(也称为std::basic_string<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);
注意,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
(也称为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>
的实现,所以这里的代码完全未经测试:(./sub>
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 将 2D 数组插入 std::vector 时"cannot convert from 'const GLfloat [12]' to '_Objty'"错误消息
- 返回"Cannot convert from 'std::ofstream {aka std::basic_ofstream<char>}' to bool"错误
- "cannot convert argument 1 from 'Node<T>' to 'std::nullptr_t"编译器错误
- 尝试使用标记调度失败:"cannot convert from bool to std::true_type"
- Custom Stringstream - Convert std::wstring & std::string
- 标准::make_pair: "cannot convert ‘int*’ to ‘std::pair<EndPointAddr*, EndPointAddr*>*’ in initial
- System::Convert::ToString()与std::to_string()的区别
- 使失败并显示错误"cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ in return"
- OSX "error: cannot convert 'const std::__cxx11::basic_string<char>"是什么意思?
- 不能将convert std::string to LPWSTR放入函数中