c - 打印 UTF-16 字符串
问题描述
所以我想解析 IDv3.4 文件。格式规范中有4 种文本编码类型:ISO-8859-1
、UTF-16 with BOM
和. 我已经编写了可以获取字符串字节的代码。UTF-16BE
UTF-8
我的问题是如何打印UTF-16 with BOM
和UTF-16BE
字节到控制台。
还有一个重要条件:我只能使用 C 库。我不能使用 C++ 库。我什至不能使用第三方 C 库。
解决方案
通常(并非专门用于单独解析 IDv3.4 文件)您将希望选择您的代码将在内部使用的通用字符编码;然后从任何其他字符编码转换为您选择的字符编码(用于输入数据 - 例如来自用户或文件或网络)并再次转换回来(用于输出,到用户或文件或网络)。
选择常用字符编码:
您想要最小化“不可转换情况”的东西 - 例如,您不想选择 ASCII,因为在太多其他字符编码中存在太多无法转换为 ASCII 的内容。这主要意味着您需要 Unicode 编码。
你想要一些方便的东西。对于 Unicode 编码,这只给你 2 个选择 - UTF-8(因为你不必关心字节序问题,它在空间/内存消耗方面相对有效,并且像 C 函数这样
strlen()
仍然可以工作)和 UTF 版本-32(因为每个代码点占用固定数量的空间,它使转换更简单一些)。其中,UTF-32 的好处大多不重要(除非您正在做字体渲染引擎)。C 编译器使用的“随机谁知道什么”字符编码是无关紧要的(对于
char
和w_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 的转换,您需要处理“不可转换”的代码点。
推荐阅读
- networkx - 由networkx中的边缘号控制的广度优先搜索?
- tensorflow - 如何在 TensorFlow 中展开 Xception 层
- mysql - MySQL 'IS NULL' 在 JOIN 查询中将值设置为 NULL
- scala - 如何通过在火花中使用 IN 子句传递另一个列值来检索列值
- c# - 我怎样才能重构它,以便具有 CardStack 脚本的多个游戏对象独立递增
- c# - C# 如何将 unHex 转换为字符串
- sharepoint - Azure 数据工厂和个人或组 SharePoint 数据类型
- javafx - JavaFX CSS 选择框和组合框
- wordpress - 在父类别上显示 Woocommerce 子类别的描述
- javascript - 谷歌表格电子邮件发送功能不起作用