c++ - “codecvt_utf8_utf16”和“codecvt_utf8”从UTF-8转换为UTF-16的区别
问题描述
我遇到了两个代码片段
std::wstring str = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>().from_bytes("some utf8 string");
和,
std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some utf8 string");
它们都是将存储的 utf-8 转换std::string
为 utf-16 in 的正确方法std::wstring
吗?
解决方案
codecvt_utf8_utf16
正如它所说的那样:在 UTF-8 和 UTF-16 之间进行转换,这两种编码都是易于理解且可移植的编码。
codecvt_utf8
在 UTF-8 和 UCS-2/4 之间转换(取决于给定类型的大小)。UCS-2 和 UTF-16不是一回事。
因此,如果您的目标是将真正的、实际的 UTF-16 存储在 a 中wchar_t
,那么您应该使用codecvt_utf8_utf16
. 但是,如果您尝试使用wchar_t
某种 Unicode 类似的东西或其他方式进行跨平台编码,则不能。UTF-16 方面始终转换为 UTF-16,而wchar_t
在非 Windows 平台上通常预计为 UTF-32/UCS-4。相比之下,codecvt_utf8
仅转换为 UCS-2/4,但在 Windows 上,wchar_t
字符串“假定”为完整的 UTF-16。
#ifdef
因此,如果没有一些或模板工作,您就无法编写满足所有平台的代码。在 Windows 上,您应该使用codecvt_utf8_utf16
; 在非 Windows 上,您应该使用codecvt_utf8
.
或者更好的是,只需在内部使用 UTF-8 并找到直接采用特定格式的字符串而不是依赖于平台的wchar_t
东西的 API。
推荐阅读
- struct - Specman - 如何将结构转换为字符串列表
- java - 如何在同一本地主机上运行两个 servlet?
- r - 如何在R中的所有行中获取每列的百分比值
- javascript - Angular父组件“作用域”子组件
- excel - 根据过滤器更改数据透视表中的平均公式
- r - Mac 无法设置 wd:error in cannot change in working directory
- javascript - 反应:搜索过滤器无法正常工作
- spring-boot - 如何在 Spring Boot 响应控制中删除 Object 的某些字段?
- akka-stream - 使用 Alpakka 的无限 AMQP 消费者
- python - 向 json 字典 python 添加新的键/值