【问题标题】:Check if file contains only < 10 bit characters检查文件是否仅包含 < 10 位字符
【发布时间】:2013-09-09 21:30:36
【问题描述】:

这是作业。我不是在寻找代码只是讨论,关于如何进行的高级建议。

我目前正在处理一项任务,我们将文件中的 UTF-16 字符转换为输出文件中的 UTF-32,反之亦然。该作业说,第一步是处理仅包含少于 10 位字符的文件,但我很难过。这是我们的第一个任务,虽然我使用过 C++,但从未真正使用过 C。

I have been reading the RFC about such conversions (S.2.1) 我觉得我理解得很好。我知道 UTF-32 字符实际上是 10 位,前面是 6 位定义它的组成(我相信 110110 表示第一对 16 位,110111 表示第二对“32”)。 UTF-16 字符是否以 6 个前导 0 开头?

还是 UTF-16 字符小于 10 位,一旦你遇到 10 位字符,你就知道你遇到了 UTF-32 位字符?

我想我真正的问题是当它可以是 8、16 等时,“10 位字符”是什么意思。但是对我提到的任何内容的任何见解都会很棒!

【问题讨论】:

  • 也许可以显示作业所说的确切文字?按照你的措辞,这并没有真正的意义。
  • "编写一个 C 程序,它将读取 UTF-32 或 UTF-16 格式的文件,并以另一种格式输出相同的文件。" 10 位部分只是说“正确处理仅包含小于 10 位字符的文件。”
  • 听起来像是问你教授的问题。它的措辞很糟糕,对我来说也没有任何意义。
  • +1 为什么人们不赞成这个?发帖人对工作的性质诚实,并没有要求完整的答案,而是寻求建议。
  • 在我看来,教授希望你首先研究一种不超过 1023 个不同字符的语言。但是你需要问你的教授。

标签: c utf-16 bits utf-32


【解决方案1】:

作业措辞不当且具有误导性。

Unicode 定义的代码点值最多可占用 20 位(U+0000 到 U+10FFFF)。所有 UTF 编码(UTF-8UTF-16UTF-32)都支持所有 20 位,只是方式不同。

UTF-8 和 UTF-16 是可变长度编码。编码给定代码点所需的字节数取决于实际代码点值。 UTF-8 使用 1、2、3 或 4 个 8 位代码单元。 UTF-16 使用 1 个或 2 个 16 位代码单元。

UTF-32 是一种定长编码。它总是使用 1 个 32 位代码单元,因为大多数系统没有 20 位数据类型。

实现 UTF 转换非常容易(它们被设计为可互换),但您首先需要知道源文件实际使用的是哪种编码。如果文件以 UTF-16 BOM 开头 ,这很容易被发现。 但是,如果没有 BOM,则需要向用户询问编码,或者使用数据的启发式分析来尝试动态检测编码。

一旦你知道了编码,剩下的就很简单了:

  1. 如果是 UTF-16,则以 16 位块读取文件(一次 1 个代码单元),根据需要组合相邻的 UTF-16 代理代码单元(非常容易检测)。对于每个完整的序列,提取编码的 16/20 位并以单个 UTF-32 代码单元输出。

  2. 如果是 UTF-32,则以 32 位块(一次 1 个代码单元)读取文件,提取 20 位,然后根据需要将它们作为 1 个或 2 个 UTF-16 代码单元输出。

作业中最困难的部分是确定源文件的编码。

【讨论】:

  • 谢谢,回复晚了!
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 2010-12-19
  • 1970-01-01
  • 2014-05-07
  • 2012-02-21
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多