【问题标题】:Print UTF-16 string打印 UTF-16 字符串
【发布时间】:2019-09-14 21:52:33
【问题描述】:

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

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

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

【问题讨论】:

  • 无论您的代码做什么,您的终端窗口都可能不支持此功能。有些字符很难以等宽、半角字体正确显示。
  • 但我无法检查它,因为我只是不知道可以打印 utf-16 字符串的函数。我认为 wprintf 可以做到,但它不能。
  • 试试putwchar
  • 取决于您的终端支持的内容——将 UTF-16 转换为它支持的内容并打印出来。既然您似乎对 UTF-8 没有问题,那么您的终端可能支持它(例如 Linux)。所以只需将 UTF-16 转换为 UTF-8 并打印出来,
  • 问题不清楚,因为解析 ID3v2标签根本不需要解释文本。

标签: c utf-16


【解决方案1】:

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

对于选择常用的字符编码:

  • 你想要一些可以最小化“不可转换案例”的东西 - 例如。您不会想要选择 ASCII,因为有太多其他字符编码无法转换为 ASCII。这主要意味着您需要 Unicode 编码。

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

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

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

假设您选择 UTF-8:

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

  • 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)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多