2013-04-16 25 views
11

我的要求之一是「文本框名稱應該只接受UTF-8字符集」。我想通過輸入非UTF-8字符集來執行負面測試。我怎樣才能做到這一點?如何生成非UTF-8字符集

+0

通過一個用戶界面,你將有一個很難做到這一點。你需要以某種方式編程。 – leppie

+2

首先定義您的*編程語言*,環境和/或上下文。這取決於你正在使用的系統/在/使用中會有很大的不同。 – deceze

+0

爲什麼DOWNVOTE這個問題? – swapneel

回答

8

如果你問如何構建一個非UTF-8字符,這應該是很容易從this definition from Wikipedia

utf8 definition

對於代碼點U + 0000到U + 007F,每個代碼點是一個字節長,看起來像這樣:

0xxxxxxx // a 

對於代碼點U + 0080到U + 07FF,每個碼點是兩個字節長,看起來像這樣:

110xxxxx 10xxxxxx // b 

依此類推。

因此,要構造一個字節長的非法UTF-8字符,最高位必須爲1(與模式a不同),而第二個最高位必須爲0(與模式b不同) :

10xxxxxx 

111xxxxx 

哪個也不同於兩個圖案。

使用相同的邏輯,您可以構造長度超過兩個字節的非法代碼單元序列。

你沒有標記語言,但我不得不測試它,所以我使用的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也參見:

image

碼點U+007F表示與一個字節0x7F(比特01111111),而碼點U+0080與兩個字節0xC2 0x80(比特11000010 10000000)表示。

如果你不熟悉UTF-8我強烈建議您閱讀這篇精彩文章:

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