打印 UTF-16 字符串

Print UTF-16 string

所以我想解析IDv3.4文件。格式规范中有4种文本编码:ISO-8859-1UTF-16 with BOMUTF-16BEUTF-8。我已经编写了可以获取字符串字节的代码。

我的问题是如何将 UTF-16 with BOMUTF-16BE 字节打印到控制台。

还有一个重要条件:我只能使用 C 库。我不能使用 C++ 库。我什至不能使用第三方 C 库。

通常(并非专门用于单独解析 IDv3.4 文件)您需要选择您的代码将在内部使用的通用字符编码;然后从任何其他字符编码转换为您选择的字符编码(对于输入数据 - 例如来自用户或文件或网络)并再次转换回来(对于输出,到用户或文件或网络)。

选择通用字符编码:

  • 你想要最小化 "nonconvertible cases" 的东西 - 例如您不想选择 ASCII,因为太多其他字符编码无法转换为 ASCII。这主要意味着您需要 Unicode 编码。

  • 你想要方便的东西。对于 Unicode 编码,这实际上只给了你 2 个选择——UTF-8(因为你不必关心字节序问题,而且它对于 space/memory 消费来说相对高效,而像 strlen() 这样的 C 函数可以仍然有效)和 UTF-32 版本(因为每个代码点占用固定数量的 space 并且它使转换更简单一些)。其中,UTF-32 的好处大多不重要(除非你在做字体渲染引擎)。

  • C 编译器使用的 "whatever random who-knows-what" 字符编码是无关紧要的(对于 charw_char),因为它是特定于实现且不可移植的。

  • 终端使用的"whatever random who-knows-what"字符编码无关(终端应考虑"just another flavor of input/output, where conversion is involved")。

假设您选择 UTF-8:

  • 您可以强制编译器为您将字符串文字视为 UTF-8(例如,像 C++ 中的 u8"hello",除了我似乎找不到任何理智的标准对于 C)。否则你需要在必要时自己做。

  • 我建议使用 uint8_t 类型来存储字符串;部分原因是 char 是 "signed or unsigned, depending on which way the wind is blowing"(由于 "shifting a signed/negative number right" 问题,这使得转换 to/from 其他字符编码很痛苦),部分原因是它有助于找到 "accidentally used something that isn't UTF-8" 错误(例如编译器关于 "conversion from signed to unsigned").

  • 的警告
  • UTF-8和UTF-32LE,UTF_32BE,UTF-16LE,UTF_16BE之间的转换是相当简单的(相关的维基百科文章足以描述它是如何工作的).

  • "UTF-16 with BOM" 表示前 2 个字节将告诉您它是 UTF-16LE 还是 UTF-16BE,因此(在添加对 UTF-16LE 和 UTF-16BE 的支持后)它是琐碎的。 "UTF-32 with BOM" 类似(前 4 个字节告诉您它是 UTF32-BE 还是 UTF32-BE)。

  • 转换 to/from ISO-8859-1 到 UTF-8 是相当简单的,因为字符匹配具有相同值的 Unicode 代码点。然而,人们经常会弄错(例如,当数据实际编码为 Windows-1252 时,说它是 ISO-8859-1);对于从 UTF-8 到 ISO-8859-1 的转换,您需要处理 "nonconvertible" 个代码点。