7
我在聲納中使用PMD,checkstyle,findbugs等。我想要一個規則來驗證Java代碼中不包含不屬於UTF-8的字符。正則表達式來檢查代碼是否包含非UTF-8字符?
E.g.字符 不應該被允許
我無法在上面的插件中找到這個規則,但我想自定義規則可以在Sonar中製作。
我在聲納中使用PMD,checkstyle,findbugs等。我想要一個規則來驗證Java代碼中不包含不屬於UTF-8的字符。正則表達式來檢查代碼是否包含非UTF-8字符?
E.g.字符 不應該被允許
我無法在上面的插件中找到這個規則,但我想自定義規則可以在Sonar中製作。
這裏是正則表達式,將匹配唯一有效的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
所以,你看對於無效的UTF-8字節序列? – alex
「 」*是一個完全有效的Unicode字符,並帶有一個有效的UTF-8字節序列...您要的是驗證編碼,這是一個相當長的正則表達式,但對於檢查編碼的工具很容易。 – deceze
http://www.w3.org/International/questions/qa-forms-utf-8 – deceze