Как я могу создать набор символов без UTF-8

В одном из моих требований указано, что "Text Box Name должно принимать только набор символов UTF-8". Я хочу выполнить отрицательный тест, введя набор символов не UTF-8. Как я могу это сделать?

Ответ 1

Если вы спрашиваете, как построить символ не-UTF-8, это должно быть легко из это определение из Википедии:

определение utf8

Для кодовых точек 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:

image

Codepoint U+007F представлен одним байтом 0x7f (bits 01111111), тогда как codepoint U+0080 представлен двумя байтами 0xC2 0x80 (bits 11000010 10000000).

Если вы не знакомы с UTF-8, я настоятельно рекомендую прочитать эту замечательную статью:

Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без отговорок!)