2012-10-29 6 views
7

Sto usando PMD, checkstyle, findbugs, ecc. In Sonar. Mi piacerebbe avere una regola per verificare che il codice Java non contenga caratteri non facenti parte di UTF-8.Regexp per verificare se il codice contiene caratteri non UTF-8?

E.g. il carattere non dovrebbe essere consentito

Non riuscivo a trovare una regola per questo nei plug-in di cui sopra, ma immagino che una regola personalizzata possa essere fatta in Sonar.

+0

Quindi stai cercando per sequenze di byte UTF-8 non valide? – alex

+0

" " * è * un carattere Unicode perfettamente valido con una sequenza di byte UTF-8 valida ... Quello che vuoi è convalidare la codifica, che è un'espressione regolare piuttosto lunga, ma facile per uno strumento che controlla le codifiche. – deceze

+0

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

risposta

8

Ecco l'espressione regolare che corrisponderà sequenze UTF-8 byte solo validi:

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

ho derivato da RFC 3629 UTF-8, a transformation format of ISO 10646 sezione 4 - Sintassi di sequenze UTF-8 byte.

fattorizzare quanto sopra dà la leggermente più corta:

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

Questo script perl semplice dimostra l'uso:

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

produce il seguente risultato:

Passstring passed 
Failstring did not pass