这种情况是一种奇怪的UTF-8编码转换吗?

时间:2016-03-11 15:31:29

标签: unicode encoding character-encoding unicode-normalization

我正在使用似乎的远程应用程序来对编码做一些魔术。应用程序呈现明确的响应(我将其称为True和False),具体取决于用户输入。我知道两个有效值,它们将呈现'True',其他所有值都应为'False'。

我发现(意外地)有趣的是,提交损坏的值导致'真'。

示例输入:

USER10 //gives True
USER11 //gives True
USER12 //gives False
USER.. //gives False
OTHERTHING //gives False

所以基本上只有这两个第一个值呈现True响应。

我注意到,USER±0(十六进制\ x55 \ x53 \ x45 \ x52 \ C0 \ xB1 \ x30)被接受为True,令人惊讶。 我确实检查了其他十六进制字节,没有成功。它让我得出结论:\ xC0 \ xB1可以某种方式转换为0x31(='1')。

我的问题是 - 怎么会发生?该应用程序是否执行了从UTF-16(或其他)到UTF-8的奇怪转换?

我很感激任何意见/想法/提示。

1 个答案:

答案 0 :(得分:2)

对于双字节UTF-8序列,

C0是无效的起始字节,但如果坏的UTF-8解码器接受它C0 B1将被解释为ASCII 31h(字符{{1} }})。

引用Wikipedia

  

...(C0和C1)只能用于无效"超长编码" ASCII字符(即尝试使用两个字节而不是一个字节来编码0到127之间的7位ASCII值....