2013-04-16 48 views
11

私の要件の1つは、「テキストボックス名はUTF-8文字セットのみを受け入れるべきです。 UTF-8以外の文字セットを入力してネガティブテストを実行したい。これどうやってするの?UTF-8以外の文字セットを生成するには

+0

は、あなたが苦労これをやっています。あなたは何とかそれをプログラム的にやる必要があります。 – leppie

+2

まず*プログラミング言語*、環境、コンテキストを定義します。これは、あなたが/ on/inで作業しているシステムによって非常に異なります。 – deceze

+0

なぜこの質問のDOWNVOTE? – swapneel

答えて

8

あなたはthis definition from Wikipediaから簡単なはず非UTF-8文字の、構築する方法を求めているならば:U + 007Fを通じてU + 0000のコードポイントについては

utf8 definition

を、各コードポイントは1でありますバイト長とこのようになります:コードポイントの場合

0xxxxxxx // a 

U + 0080 U + 07FF通じ、各コードポイントは2バイト長であり、このようになります。

110xxxxx 10xxxxxx // b 

など。

1バイト長の不正なUTF-8文字を作成するには、最上位ビットを1(パターンaと異なる)にし、2番目のビットを0(パターンbと異なる)にする必要があります。 :

10xxxxxx 

あるいはまた、両方のパターンとは異なり

111xxxxx 

同じロジックを使用すると、2バイト以上の不正なコードユニットシーケンスを構築することができます。

あなたは言語にタグを付けていなかったが、私はそれをテストしなければならなかったので、私は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 � 

delete0x7fであり、その後は128から254まで有効な文字は印刷されません。また、UTF-8 chartableから見ることができます:コードポイントU+0080は2バイト0xC2 0x80(ビット11000010 10000000)で表現されている間

image

コードポイントU+007Fは、1バイト0x7F(ビット01111111)で表されます。

あなたはUTF-8に慣れていない場合、私は強く、この優れた記事を読んでお勧めします。UI経由

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

関連する問題