【问题标题】:Difference between "codecvt_utf8_utf16" and "codecvt_utf8" for converting from UTF-8 to UTF-16“codecvt_utf8_utf16”和“codecvt_utf8”从UTF-8转换为UTF-16的区别
【发布时间】:2019-08-24 15:01:14
【问题描述】:

我遇到了两个代码 sn-ps

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");

它们都是将std::string 中存储的utf-8 转换为std::wstring 中的utf-16 的正确方法吗?

【问题讨论】:

    标签: c++ c++11 unicode codecvt


    【解决方案1】:

    codecvt_utf8_utf16 确实如其所说:在 UTF-8 和 UTF-16 之间进行转换,这两种编码都是易于理解且可移植的编码。

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

    因此,如果您的目标是将真正的、实际的 UTF-16 存储在 wchar_t 中,那么您应该使用 codecvt_utf8_utf16。但是,如果您尝试使用 wchar_t 进行跨平台编码作为某种 Unicode-ish 之类的东西,那么您就做不到。 UTF-16 facet 始终转换为 UTF-16,而非 Windows 平台上的 wchar_t 通常预计为 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。

    【讨论】:

    • 您是否建议使用 ICU 库,因为 codecvt 将被弃用?我找不到足够的例子来使用 ICU 来做我想做的事情。它是否也像我写的那样有一行代码来完成这项工作?
    • @user963241: codecvt 已被弃用。但它仍然可用; deprecated 并不意味着“已删除”。尽管如此,我还是会推荐一个真正的 Unicode 库,因为 codecvt 非常糟糕。
    • 谢谢,只要不使用C++17,还能安全使用吗?
    • @user963241:“已弃用”并不意味着“已删除”。您可以在 所有 版本的 C++ 中安全地使用它,直到它真正被删除。
    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 2013-02-25
    • 2015-09-19
    • 2011-03-09
    • 2020-01-28
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多