这是作业。我不是只是讨论代码,而是关于如何继续进行的高级建议。
我目前正在进行一项任务,我们将文件中的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等等。但是对我提到的任何事物的任何见解都会很棒!
答案 0 :(得分:1)
这项任务措辞严厉且具有误导性。
Unicode定义的代码点值最多可能需要 20位(U + 0000到U + 10FFFF)。所有UTF编码(UTF-8,UTF-16和UTF-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,那么您需要询问用户编码,或者使用数据的启发式分析来尝试动态检测编码。
一旦你知道编码,剩下的就是直截了当:
如果是UTF-16,则以16位块(每次1个代码单元)读取文件,根据需要组合相邻的UTF-16代理代码单元(非常容易检测)。对于每个已完成的序列,提取编码的16/20位并将其输出为单个UTF-32代码单元。
如果是UTF-32,以32位块(每次1个代码单元)读取文件,提取20位,并根据需要将它们作为1或2个UTF-16代码单元。
分配中最困难的部分是确定源文件的编码。