首页 > 解决方案 > 打印 UTF-16 字符串

问题描述

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

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

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

标签: cutf-16

解决方案


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

选择常用字符编码:

  • 您想要最小化“不可转换情况”的东西 - 例如,您不想选择 ASCII,因为在太多其他字符编码中存在太多无法转换为 ASCII 的内容。这主要意味着您需要 Unicode 编码。

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

  • C 编译器使用的“随机谁知道什么”字符编码是无关紧要的(对于charw_char),因为它是特定于实现的并且不可移植。

  • 终端使用的“随机谁知道什么”字符编码是无关紧要的(终端应被视为“只是另一种输入/输出,其中涉及转换”)。

假设您选择 UTF-8:

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

  • 我建议使用uint8_t存储字符串的类型;部分原因char是“有符号或无符号,取决于风向如何”(由于“向右移动有符号/负数”问题,这使得与其他字符编码的转换变得痛苦),部分原因是它有助于找到“意外使用了不是 UTF-8 的错误(例如,编译器发出的关于“从有符号转换为无符号”的警告)。

  • UTF-8 和 UTF-32LE、UTF_32BE、UTF-16LE、UTF_16BE 之间的转换相当简单(相关的维基百科文章足以描述其工作原理)。

  • “带有 BOM 的 UTF-16”意味着前 2 个字节会告诉您它是 UTF-16LE 还是 UTF-16BE,所以(在添加对 UTF-16LE 和 UTF-16BE 的支持之后)它是微不足道的。“带有 BOM 的 UTF-32”类似(前 4 个字节告诉您它是 UTF32-BE 还是 UTF32-BE)。

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


推荐阅读