如何生成非UTF-8字符集

如何生成非UTF-8字符集,utf-8,Utf 8,我的一个要求是“文本框名称应只接受UTF-8字符集”。我想通过输入非UTF-8字符集来执行否定测试。我如何才能做到这一点?如果您询问如何构造非UTF-8字符,应该可以从以下几方面轻松解决: 对于代码点U+0000到U+007F,每个代码点的长度为一个字节,如下所示: 0xxxxxxx // a 110xxxxx 10xxxxxx // b 对于代码点U+0080到U+07FF,每个代码点有两个字节长,如下所示: 0xxxxxxx // a 110xxxxx 10xxxxxx

我的一个要求是“文本框名称应只接受UTF-8字符集”。我想通过输入非UTF-8字符集来执行否定测试。我如何才能做到这一点?

如果您询问如何构造非UTF-8字符,应该可以从以下几方面轻松解决:

对于代码点U+0000到U+007F,每个代码点的长度为一个字节,如下所示:

0xxxxxxx   // a
110xxxxx 10xxxxxx  // b
对于代码点U+0080到U+07FF,每个代码点有两个字节长,如下所示:

0xxxxxxx   // a
110xxxxx 10xxxxxx  // b
等等

因此,要构造一个1字节长的非法UTF-8字符,最高位必须是1(不同于模式a),第二高位必须是0(不同于模式b):

这两种模式也不同

使用相同的逻辑,您可以构造长度超过两个字节的非法代码单元序列

您没有标记语言,但我必须测试它,所以我使用Java:

for (int i=0;i<255;i++) {
    System.out.println( 
        i + " " + 
        (byte)i + " " + 
        Integer.toHexString(i) + " " + 
        String.format("%8s", Integer.toBinaryString(i)).replace(' ', '0') + " " + 
        new String(new byte[]{(byte)i},"UTF-8")
    );
}
delete
0x7f
,在它之后,从128个字符(含)到254个字符,都不会打印有效字符。您还可以从中看到:

码点
U+007F
用一个字节
0x7F
(位
01111111
)表示,而码点
U+0080
用两个字节
0xC2 0x80
(位
11000010 10000000
)表示

如果您不熟悉UTF-8,我强烈建议您阅读这篇优秀的文章:


通过用户界面,您将很难做到这一点。你需要以编程的方式来完成它。首先定义你的编程语言、环境和/或上下文。这将因您使用的系统不同而有很大差异。为什么对这个问题投反对票?
...
31 31 1f 00011111 
32 32 20 00100000  
33 33 21 00100001 !
...
126 126 7e 01111110 ~
127 127 7f 01111111 
128 -128 80 10000000 �