首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从UTF-8转换为UTF-16的"codecvt_utf8_utf16“和"codecvt_utf8”的区别

从UTF-8转换为UTF-16的"codecvt_utf8_utf16“和"codecvt_utf8”的区别
EN

Stack Overflow用户
提问于 2019-08-24 15:01:14
回答 1查看 1.2K关注 0票数 1

我遇到了两个代码片段

代码语言:javascript
复制
std::wstring str = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>().from_bytes("some utf8 string");

和,

代码语言:javascript
复制
std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some utf8 string");

它们是否都正确地将存储在std::string中的utf-8转换为std::wstring中的utf-16?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-24 15:12:50

codecvt_utf8_utf16所做的正是它所说的:在UTF-8和UTF-16之间进行转换,这两者都是可理解和可移植的编码。

codecvt_utf8在UTF-8和UCS-2/4之间进行转换(取决于给定类型的大小)。UCS-2和UTF-16不是一回事.

因此,如果您的目标是在wchar_t中存储真正的、实际的UTF-16,那么您应该使用codecvt_utf8_utf16。然而,如果您尝试使用wchar_t作为某种Unicode的东西进行跨平台编码,您就不能这样做。UTF-16方面总是转换为UTF-16,而在非Windows平台上的wchar_t通常是UTF-32/UCS-4。相比之下,codecvt_utf8只转换为UCS-2/4,但在wchar_t上,wchar_t字符串被“假定”为完全UTF-16。

因此,如果没有一些#ifdef或模板工作,就无法编写满足所有平台的代码。在Windows上,您应该使用codecvt_utf8_utf16;在非Windows上,您应该使用codecvt_utf8.

或者更好的是,只需在内部使用UTF-8,并找到直接以特定格式(而不是依赖于平台的wchar_t )接受字符串的API。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57639108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档