2013-04-16 2 views
11

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

+0

Через интерфейс вы будете иметь трудное время, делая это. Вам нужно как-то сделать это программно. – leppie

+2

Начните с определения вашего * языка программирования *, среды и/или контекста. Это очень сильно изменится в зависимости от того, с какой системой вы работаете/в/в. – deceze

+0

Почему DOWNVOTE для этого вопроса? – swapneel

ответ

8

Если вы спрашиваете, как построить не-UTF-8 символов, которые должны быть легко от this definition from Wikipedia:

utf8 definition

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

image

U+007F элемента кода представлен одним байта 0x7F (бит 01111111), в то время как элемент код U+0080 представлены два байт 0xC2 0x80 (биты 11000010 10000000).

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

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

Смежные вопросы