我正在使用似乎的远程应用程序来对编码做一些魔术。应用程序呈现明确的响应(我将其称为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的奇怪转换?
我很感激任何意见/想法/提示。
答案 0 :(得分:2)
C0
是无效的起始字节,但如果坏的UTF-8解码器接受它C0 B1
将被解释为ASCII 31h(字符{{1} }})。
引用Wikipedia:
...(C0和C1)只能用于无效"超长编码" ASCII字符(即尝试使用两个字节而不是一个字节来编码0到127之间的7位ASCII值....