Scénario d'utilisation
Nous avons mis en place un webservice que notre interface web les développeurs à utiliser (via une api php) en interne pour afficher des données de produit. Sur le site web de l'utilisateur tape quelque chose (c'est à dire une chaîne de requête). En interne, le site web fait un appel au service via l'api.
Remarque: Nous utilisons restlet, pas de tomcat
Problème D'Origine
Firefox 3.0.10 semble respecter l'encodage sélectionné dans le navigateur et coder une url en fonction de l'encodage. Cela ne se traduisent dans les différentes chaînes de requête pour ISO-8859-1 et UTF-8.
Notre site web transmet l'entrée de l'utilisateur et de ne pas le convertir (ce qui doit être), donc il peut faire appel au service via l'api d'appeler un service web à l'aide d'une chaîne de requête qui contient des accents.
I. e. pour une requête de la partie la recherche comme
...v=abcädef
si "ISO-8859-1" est sélectionné, l'envoi de la requête de la partie ressemble
...v=abc%E4def
mais si "UTF-8" est sélectionné, l'envoi de la requête de la partie ressemble
...v=abc%C3%A4def
Solution Souhaitée
Comme nous le contrôle du service, car nous avons mis en œuvre, nous voulons vérifier sur le côté serveur si l'appel ne contient pas de caractères utf-8, si oui, répondre avec un 4xx d'état http
Solution Actuelle En Détail
Vérifier pour chaque caractère ( == chaîne de caractères.substring(i,i+1) )
- si le personnage.getBytes()[0] est égal à 63 ans pour les '?'
- si le Personnage.getType(caractère.charAt(0)) renvoie OTHER_SYMBOL
Code
protected List< String > getNonUnicodeCharacters( String s ) {
final List< String > result = new ArrayList< String >();
for ( int i = 0 , n = s.length() ; i < n ; i++ ) {
final String character = s.substring( i , i + 1 );
final boolean isOtherSymbol =
( int ) Character.OTHER_SYMBOL
== Character.getType( character.charAt( 0 ) );
final boolean isNonUnicode = isOtherSymbol
&& character.getBytes()[ 0 ] == ( byte ) 63;
if ( isNonUnicode )
result.add( character );
}
return result;
}
Question
Sera-ce à attraper tous invalide (non encodé en utf) caractères? Ne vous avez un mieux (plus facile) solution?
Note: j'ai vérifié URLDecoder avec le code suivant
final String[] test = new String[]{
"v=abc%E4def",
"v=abc%C3%A4def"
};
for ( int i = 0 , n = test.length ; i < n ; i++ ) {
System.out.println( java.net.URLDecoder.decode(test[i],"UTF-8") );
System.out.println( java.net.URLDecoder.decode(test[i],"ISO-8859-1") );
}
Cette affiche:
v=abc?def
v=abcädef
v=abcädef
v=abcädef
et il n'est pas à jeter un IllegalArgumentException soupir