В одном из моих требований указано, что "Text Box Name должно принимать только набор символов UTF-8". Я хочу выполнить отрицательный тест, введя набор символов не UTF-8. Как я могу это сделать?
Как я могу создать набор символов без UTF-8
Ответ 1
Если вы спрашиваете, как построить символ не-UTF-8, это должно быть легко из это определение из Википедии:
Для кодовых точек U + 0000 через U + 007F каждый кодовый пример длинный один и выглядит следующим образом:
0xxxxxxx // a
Для кодовых точек U + 0080 через U + 07FF каждая кодовая точка имеет два байта и выглядит следующим образом:
110xxxxx 10xxxxxx // b
И так далее.
Итак, чтобы построить недопустимый символ UTF-8 длиной в один байт, старший бит должен быть 1 (отличаться от шаблона a), а второй старший бит должен быть 0 (отличаться от шаблона b):
10xxxxxx
или
111xxxxx
Который также отличается от обоих шаблонов.
С помощью той же логики вы можете создавать нелегальные последовательности кода, которые имеют длину более двух байтов.
Вы не отметили язык, но мне пришлось его протестировать, поэтому я использовал 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")
);
}
От 0 до 31 являются непечатаемыми символами, тогда 32 - это пробел, за которым следуют печатные символы:
...
31 31 1f 00011111
32 32 20 00100000
33 33 21 00100001 !
...
126 126 7e 01111110 ~
127 127 7f 01111111
128 -128 80 10000000 �
delete
равен 0x7f
, а после него от 128 включительно до 254 не печатаются действительные символы. Вы также можете видеть из UTF-8:
Codepoint U+007F
представлен одним байтом 0x7f
(bits 01111111
), тогда как codepoint U+0080
представлен двумя байтами 0xC2 0x80
(bits 11000010 10000000
).
Если вы не знакомы с UTF-8, я настоятельно рекомендую прочитать эту замечательную статью: