2012-10-29 43 views
7

我在聲納中使用PMD,checkstyle,findbugs等。我想要一個規則來驗證Java代碼中不包含不屬於UTF-8的字符。正則表達式來檢查代碼是否包含非UTF-8字符?

E.g.字符 不應該被允許

我無法在上面的插件中找到這個規則,但我想自定義規則可以在Sonar中製作。

+0

所以,你看對於無效的UTF-8字節序列? – alex

+0

「 」*是一個完全有效的Unicode字符,並帶有一個有效的UTF-8字節序列...您要的是驗證編碼,這是一個相當長的正則表達式,但對於檢查編碼的工具很容易。 – deceze

+0

http://www.w3.org/International/questions/qa-forms-utf-8 – deceze

回答

8

這裏是正則表達式,將匹配唯一有效的UTF-8字節序列:

/^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/ 

我從RFC 3629 UTF-8, a transformation format of ISO 10646部4衍生它 - 語法UTF-8字節序列的。

因式分解上面給出的略短:

/^([\x00-\x7F]|([\xC2-\xDF]|\xE0[\xA0-\xBF]|\xED[\x80-\x9F]|(|[\xE1-\xEC]|[\xEE-\xEF]|\xF0[\x90-\xBF]|\xF4[\x80-\x8F]|[\xF1-\xF3][\x80-\xBF])[\x80-\xBF])[\x80-\xBF])*$/ 

這個簡單的Perl腳本演示用途:

#!/usr/bin/perl -w 
my $passstring = "This string \xEF\xBF\xBD == � is valid UTF-8"; 
my $failstring = "This string \x{FFFD} == � is not valid UTF-8"; 
if ($passstring =~ /^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/) 
    { 
    print 'Passstring passed'."\n"; 
    } 
else 
    { 
    print 'Passstring did not pass'."\n"; 
    } 
if ($failstring =~ /^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/) 
    { 
    print 'Failstring passed'."\n"; 
    } 
else 
    { 
    print 'Failstring did not pass'."\n"; 
    } 
exit; 

它產生以下輸出:

Passstring passed 
Failstring did not pass 
相關問題