- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在头文件 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/
我们正在使用一个 std::wstring_convert> converter; 在我们的记录器中,它从遗留组件获取 UTF-16 字符串并将其转换为我们写入日志的 UTF-8。转换器在每次转换时都
我希望能够将从文件中读取的文本转换为多字节字符。我在 Windows 上有以下适用于我的 C++ 代码。当我尝试在 Linux 上编译代码时失败了。 #include .... std::wstri
我有 C++ 代码将包含 🜆( ALCHEMICAL SYMBOL FOR AQUA REGIA ) 的 string 转换为 u16string: #include #include #inc
我正在编写一些需要使用系统语言环境在字节字符串和宽字符串之间进行转换的代码。从文件中读取时,这非常容易做到。我可以使用 std::wifstream , 用 std::locale("") 灌输它,
这个问题在这里已经有了答案: Specification of source charset encoding in MSVC++, like gcc "-finput-charset=CharSe
我正在计划使用 C++Builder 10.1 (Clang 3.3) 的新 C++11 Win32/64 项目,并考虑在核心功能方面以最便携的方式实现它,所以我想使用 UTF-8 作为 std::s
我正在使用 std::wstring_convert 将 wstring 转换为多字节字符串,如下所示: // convert from wide char to multibyte char
在头文件 locale 中声明了两个方便的接口(interface):std::wstring_convert 和 std::wbuffer_convert。但是,没有使用示例。 有没有简明的例子说明
我正在从一个 utf-8 文本文件中获取文本,并按 block 执行以提高性能。 std::ifstream.read(myChunkBuff_str, myChunkBuff_str.length(
当您从 std::u16string 转到时,假设 std::u32string,std::wstring_convert 不起作用正如它所期望的那样 chars。那么如何使用 std::wstrin
C++11 的 std::wstring_convert效果很好 * 用于标准 UTF-8 UTF-16/UCS2/UCS4 转换。但是,当我尝试使用不是来自 的构面实例化 wstring_con
我是一名优秀的程序员,十分优秀!