2012-10-29 7 views
7

Używam PMD, checkstyle, findbugs itp. W sonarze. Chciałbym mieć regułę sprawdzającą, czy kod Java nie zawiera znaków, które nie są częścią UTF-8.Regexp, aby sprawdzić, czy kod zawiera znaki inne niż UTF-8?

E.g. znak nie powinien być dozwolony

Nie mogłem znaleźć reguły w powyższych wtyczkach, ale przypuszczam, że w Sonarze można wprowadzić niestandardową regułę.

+0

Więc patrząc dla niepoprawnych sekwencji bajtów UTF-8? – alex

+0

" " * jest * doskonale prawidłowym znakiem Unicode z poprawną sekwencją bajtów UTF-8 ... To czego potrzebujesz, to sprawdzanie kodowania, które jest dość długim wyraże- niem, ale łatwe dla narzędzia, które sprawdza kodowanie. – deceze

+0

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

Odpowiedz

8

Oto wyrażenie regularne, które dopasuje ważne tylko sekwencje UTF-8 bajtów:

/^([\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})*$/ 

Mam pochodzi to od RFC 3629 UTF-8, a transformation format of ISO 10646 Sekcja 4 - Składnia sekwencji UTF-8 bajtów.

Factorizing powyższych daje nieco krótszy:

/^([\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])*$/ 

Ten prosty skrypt perl demonstruje Zastosowanie:

#!/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; 

Produkuje następujący wynik:

Passstring passed 
Failstring did not pass