2013-04-16 23 views
11

Uno dei miei requisiti dice "Il nome della casella di testo deve accettare solo il set di caratteri UTF-8". Voglio eseguire un test negativo inserendo un set di caratteri non UTF-8. Come posso fare questo?Come posso generare un set di caratteri non UTF-8

+0

Via un'interfaccia utente si avrà un momento difficile fare questo. Dovrai in qualche modo farlo in modo programmatico. – leppie

+2

Inizia definendo il * linguaggio di programmazione *, l'ambiente e/o il contesto. Questo molto varierà a seconda del sistema con cui stai lavorando/su/in. – deceze

+0

perché DOWNVOTE per questa domanda? – swapneel

risposta

8

Se ti stai chiedendo come costruire un non-caratteri UTF-8, che dovrebbe essere facile da this definition from Wikipedia:

utf8 definition

Per i punti di codice U + 0000 e U + 007F, ogni codepoint è uno lunga di byte e si presenta così:

0xxxxxxx // a 

Per i punti di codice U + 0080 tramite U + 07FF, ogni codepoint è lungo due byte e simile a questa:

110xxxxx 10xxxxxx // b 

E così via.

Quindi, per costruire un carattere UTF-8 illegale lungo un byte, il bit più alto deve essere 1 (per essere diverso dal pattern a) e il secondo bit più alto deve essere 0 (per essere diverso dal pattern b) :

10xxxxxx 

o

111xxxxx 

che si differenzia anche da entrambi i modelli.

Con la stessa logica, è possibile creare sequenze di codeunit illegali lunghe più di due byte.

Non hai contrassegnare una lingua, ma ho dovuto provarlo, così ho utilizzato 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 a 31 sono i caratteri non stampabili, quindi 32 è lo spazio, seguito da caratteri stampabili:

... 
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 e dopo, da 128 inclusivamente fino a 254 caratteri non validi vengono stampati. Si può vedere dalla anche la UTF-8 chartable:

image

Codepoint U+007F è rappresentato con un byte (bit 0x7F01111111), mentre codepoint U+0080 è rappresentato con due byte 0xC2 0x80 (bit 11000010 10000000).

Se non si ha familiarità con UTF-8 vi consiglio vivamente di leggere questo ottimo articolo:

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

Problemi correlati