【问题标题】:Windows: UTF-16BE to UTF-8Windows:UTF-16BE 到 UTF-8
【发布时间】:2016-01-12 17:19:55
【问题描述】:

谁能告诉我强制 Windows 处理 big endian UTF-16 所需的秘密无证黑魔法咒语吗?

只需调用 WideCharToMultiByte() 即可将 UTF-16LE 转换为 UTF-8。但是我如何使它适用于 UTF-16BE?我已经搜索和搜索并搜索了,我找不到任何有关此的信息。 (我不可能是地球上第一个需要这样做的人……)

很明显,大端序数并不是英特尔平台所固有的,但 Windows 肯定有一个 API 可以在某个地方处理这个问题。

【问题讨论】:

  • 我不认为是这样(因为它不是受支持的编码)。只需自己交换endieness(是那个词),然后致电WideCharToMultiByte
  • Richard 是对的,也是正确的选择。 Windows 期望输入在 LE 中。准备 Windows 想要的数据并获得所需的数据。 @RichardCritten:可能值得作为答案。
  • _swab() 完成工作。一个posix函数,呵呵。
  • @HansPassant 这绝对是答案:)。除了swab是posix函数,_swab是microsft的版本^^.
  • 但是...如果您有一个以 UTF-16BE 编码并带有 BOM 的文件,诸如记事本之类的程序可以很好地加载它。你真的是说每个需要处理 UTF-16BE 的程序都独立地重新实现它吗?

标签: c++ windows unicode


【解决方案1】:

很明显,大端序数并不是英特尔平台所固有的,但 Windows 肯定有一个 API 可以在某个地方处理这个问题。

不。它仅支持 UTF-16LE。要处理 UTF-16BE,您必须先通过交换每个 UTF-16 代码单元的字节来转换为 UTF-16LE。

您应该考虑使用专用的 Unicode 库,例如 ICONVICU。两者都支持 UTF-8、UTF-16LE 和 UTF-16BE。

如果您使用的是 C++11,您也可以使用其内置的 std::codecvt_utf8_utf16 facet 在 UTF-8 和 UTF-16 LE/BE 之间进行转换。您可以使用std::wstring_convert()std::wbuffer_convert() 函数来执行实际的转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2012-07-19
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多