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?
Odpowiedz
Jeśli proszą jak skonstruować niż UTF-8 znaków, które powinny być łatwe od this definition from Wikipedia:
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:
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ł:
Via UI będzie mieć twardy czas to robi. Będziesz musiał jakoś to zrobić programowo. – leppie
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
dlaczego DOWNVOTE na to pytanie? – swapneel