UTF-8解码器应如何正确处理无效代码点(代理,大于0x10ffff)?

时间:2018-09-30 11:20:17

标签: utf-8

我正在编写UTF-8解码器,但我不知道如何正确处理无效的代码点:

  • 代孕
  • 代码点大于0x10ffff

假设,我想用0xfffd替换无效的代码点。现在,我应该如何更换它们?在我知道该编码点无效之后,还是应该立即解码/使用第一个字节要求的所有字节?

例如,假设UTF-8流包含:0xf4 0x90 0x80 0x80

这些字节解码为无效的代码点0x110000

但是,我知道在处理第二个字节0xf4 0x90时,无论最后两个字节是什么,它都不是有效的代码点。

因此,此流应生成一个错误(和一个替换),还是应生成3个错误(因为0xf4 0x90无效,然后0x80而另一个0x80无效还有)?

是否存在强制执行此操作的标准?如果没有,什么是最佳做法?

2 个答案:

答案 0 :(得分:0)

我在Unicode标准chapter 03的第126-129页中找到了答案:

  • unicode标准规定,格式正确的子序列不得作为格式不正确的序列的一部分被使用(不过,我的示例中没有这种情况)
  • 有一个建议遵循W3C:格式错误的子序列的最大子部分会产生一个错误(请参见链接文档中的定义)
  • 0xf4 0x90 0x80 0x80的第二个字节无效,因此如果遵循建议,我应该产生 4 错误(由于第二个字节无效,开头的最大子部分仅为{ {1}})

如果我的示例是0xf4,那么我应该只生成 1 错误,因为0xf4 0x8f 0x41是最大的子部分,而0xf4 0x8f是很好的-形成的子序列。

答案 1 :(得分:0)

Unicode联盟似乎只关注准确性(不丢弃好字节)和安全性(不将两段好文本放在一起,因为安全扫描器在考虑坏字节时可能给了文本通行证,但也许会阻止了清理文本)。它允许其他人定义任何特定的做法。 (似乎已经提出了最佳做法,但是自W3C正式制定以来,back away将会提出。)

W3C当然与安全性有关,但也与您要求的一致性有关。它会根据每个非常详细的reference UTF-8 Decoder algorithm来告知每个格式错误的子序列错误(例如插入替换字符)。