检查文件是否仅包含< 10位字符

时间:2013-09-05 21:57:54

标签: c utf-16 bits utf-32

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

我目前正在进行一项任务,我们将文件中的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位字符吗?

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

1 个答案:

答案 0 :(得分: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代码单元。

  3. 分配中最困难的部分是确定源文件的编码。