2009-10-06 6 views
0

Cette ligne de code, qui décode un mot chinois codé:Codage/Décodage question étrange

URLDecoder.decode("%E4%BB%BB%E4%BD%95%E8%BD%A6%E8%BE%86%E5%BA%94", 
    "UTF-8").getBytes().length 

Quand je lance dans une page JSP (sur Jboss) il imprime 5:

<%= URLDecoder.decode("%E4%BB%BB%E4%BD%95%E8%BD%A6%E8%BE%86%E5%BA%94", 
     "UTF-8").getBytes().length %> 

Exécution dans une application de bureau imprime 15:

public static void main(String[] args) { 
    System.out.println(URLDecoder.decode(
     "%E4%BB%BB%E4%BD%95%E8%BD%A6%E8%BE%86E5%BA%94", "UTF-8" 
    ).getBytes().length); 
} 

Pourquoi? Et je veux que le jsp obtienne 15 aussi, comment?

+0

êtes-vous SÛR? Vérifiez soigneusement s'il y a quelque chose d'autre qui ne va pas. à quoi ressemble votre page JSP? le 1 des 15 n'est-il pas caché? le code Java dans une JSP est juste du code Java normal, exactement le même que le code Java dans une servlet (en fait, les JSP sont converties en servlets). – Jesper

+0

La page JSP ne contient rien d'autre que l'instruction d'importation URLDecoder, je l'utilise uniquement pour le test. – Moro

+0

Et non, c'est 5 je le vois correctement. – Moro

Répondre

2

Il semble que JBoss utilise un codage par défaut différent, qui ne peut pas représenter tous les caractères de votre chaîne. Vous devriez probablement utiliser getBytes("UTF-8").

0

Je ne sais pas pourquoi il y a une différence (qui dépend des environnements Java particuliers que vous êtes en cours d'exécution), mais je peux vous dire ce que cette différence est:

Il y a 15 octets dans votre chaîne. Ces octets représentent 5 caractères Unicode, de 3 octets chacun.

Vous pouvez le dire car le premier octet d'un caractère UTF-8 de 3 octets commence toujours par "E" hexadécimal.