2013-04-16 5 views
11

Eine meiner Anforderungen sagt "Textfeld Name sollte nur UTF-8 Zeichensatz akzeptieren". Ich möchte einen negativen Test durchführen, indem ich einen nicht UTF-8-Zeichensatz eingib. Wie kann ich das machen?Wie kann ich einen Nicht-UTF-8-Zeichensatz erzeugen

+0

über eine Benutzeroberfläche haben Sie eine harte Zeit, dies zu tun. Sie müssen es irgendwie programmatisch tun. – leppie

+2

Beginnen Sie mit der Definition Ihrer * Programmiersprache *, Umgebung und/oder Kontext. Dies hängt sehr davon ab, mit welchem ​​System Sie gerade arbeiten. – deceze

+0

Warum DOWNVOTE für diese Frage? – swapneel

Antwort

8

Wenn Sie fragen, wie eine nicht-UTF-8-Zeichen zu konstruieren, die aus this definition from Wikipedia sollte einfach sein:

utf8 definition

Für Codepunkten U + 0000 bis U + 007F, die jeweils Codepunkt ist ein Byte lang und sieht wie folgt aus:

0xxxxxxx // a 

Für Codepunkten U + 0080 bis U + 07FF, jeder Codepunkt zwei Bytes lang ist und wie folgt aussehen:

110xxxxx 10xxxxxx // b 

Und so weiter.

also ein illegales UTF-8-Zeichen zu konstruieren, die ein Byte lang ist, muss das höchste Bit 1 sein (anders sein Muster a) und die zweithöchsten Bit muss 0 sein (von den Mustern b verschieden sein kann) :

10xxxxxx 

oder

111xxxxx 

Welche auch von beiden Muster unterscheidet.

Mit der gleichen Logik können Sie illegale Codeunit-Sequenzen erstellen, die mehr als zwei Bytes lang sind.

Sie haben keine Sprache Tag, aber ich hatte es zu testen, so habe ich 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 bis 31 sind nicht druckbare Zeichen, dann 32 ist der Raum, durch druckbare Zeichen gefolgt:

... 
31 31 1f 00011111 
32 32 20 00100000 
33 33 21 00100001 ! 
... 
126 126 7e 01111110 ~ 
127 127 7f 01111111 
128 -128 80 10000000 � 

delete0x7f ist und, nachdem es von 128 bis einschließlich 254 sind keine gültigen Zeichen gedruckt. Sie können von der UTF-8 chartable siehe auch:

image

Codepoint U+007F wird mit einem Byte 0x7F (Bits 01111111) dargestellt, während Codepoint U+0080 mit zwei Bytes dargestellt wird 0xC2 0x80 (Bits 11000010 10000000).

Wenn Sie nicht vertraut mit UTF-8 sind stark Ich empfehle diesen ausgezeichneten Artikel zu lesen:

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

Verwandte Themen