2013-04-16 11 views
11

Jedno z moich wymagań mówi: "Nazwa pola tekstowego powinna akceptować tylko zestaw znaków UTF-8". Chcę przeprowadzić negatywny test, wprowadzając zestaw znaków inny niż UTF-8. Jak mogę to zrobić?Jak wygenerować zestaw znaków inny niż UTF-8?

+0

Via UI będzie mieć twardy czas to robi. Będziesz musiał jakoś to zrobić programowo. – leppie

+2

Zacznij od zdefiniowania * języka programowania *, środowiska i/lub kontekstu. Będzie to bardzo różne w zależności od systemu, w którym pracujesz z/na/w. – deceze

+0

dlaczego DOWNVOTE na to pytanie? – swapneel

Odpowiedz

8

Jeśli proszą jak skonstruować niż UTF-8 znaków, które powinny być łatwe od this definition from Wikipedia:

utf8 definition

Dla punktów kodowych U + 0000 do U + 007F, każdy punkt kodowy jest jednym bajt długości i wygląda następująco:

0xxxxxxx // a 

Dla punktów kodowych U + 0080 do U + 07FF, każdy punkt kodowy jest długi dwa bajty i wyglądać tak:

110xxxxx 10xxxxxx // b 

I tak dalej.

Tak więc, aby skonstruować niedozwolony znak UTF-8, który ma jeden bajt, najwyższy bit musi wynosić 1 (aby być różny od wzorca a), a drugi najwyższy bit musi być równy 0 (aby być różny od wzorca b) :

10xxxxxx 

lub

111xxxxx 

który różni się też od obu wzorów.

Przy użyciu tej samej logiki można skonstruować niedozwolone sekwencje kodu, które mają więcej niż dwa bajty.

Nie oznacz język, ale musiałem go przetestować, więc użyłem 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 do 31 są znaki niedrukowalne, następnie 32 jest przestrzeń, a następnie druku znaków:

... 
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 to 0x7f i po nim, od 128 włącznie do 254 nie są drukowane prawidłowe znaki. Można zobaczyć z UTF-8 chartable także:

image

kodowy U+007F jest reprezentowany przez jeden bajt 0x7F (bity 01111111), natomiast punkt kodowy U+0080 jest reprezentowana przez dwa bajty 0xC2 0x80 (bitów 11000010 10000000).

Jeśli nie są zaznajomieni z UTF-8 gorąco polecam czytanie tego doskonały artykuł:

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

Powiązane problemy