utf-8 décodage en java

Je suis en train de passer des paramètres à partir d'un PHP de niveau intermédiaire à un java backend qui comprend J2EE. Je suis en train d'écrire le code du contrôleur en Groovy. Là, je suis en train de décoder un certain nombre de paramètres susceptibles de contenir des caractères internationaux.

Je suis vraiment surpris par les résultats de mon débogage ce problème jusqu'à maintenant, donc je voulais le partager avec vous dans l'espoir que quelqu'un sera en mesure de donner la bonne interprétation de mes résultats.

Pour le bien de mon petit test, le paramètre que je suis de passage est "déjeuner". Juste pour être sûr, le Système de..println("déjeuner") correctement me donne:

déjeuner

dans la console

Maintenant sont les suivantes char/dec et les valeurs hexadécimales de chaque caractère de la chaîne d'origine:

next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72

noter que le c3a9 séquence UTF-8 est le souhaitait-de caractère: http://www.fileformat.info/info/unicode/char/00e9/index.htm

Maintenant, si j'essaie de lire cette chaîne comme une chaîne UTF-8, comme dans stmt.getBytes("UTF-8"), j'ai soudainement finir par avoir un de 11 octets de la séquence, comme suit:

64 c3 83 c2 a9 6a 65 75 6e 65 72

alors que stmt.getBytes("iso-8859-1") me donne 9 octets:

64 c3 a9 6a 65 75 6e 65 72

note le c3a9 séquence ici!

maintenant, si j'essaie de convertir le format UTF-8 séquence UTF-8, comme dans

new String(stmt.getBytes("UTF-8"), "UTF-8");

J'obtiens:

next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72

note le c3a9 séquence

tout

new String(stmt.getBytes("iso-8859-1"), "UTF-8")

résultats dans:

next char: d 100 64
next char: ? -23 e9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72

note de la e9 qui en utf-8 (et ascii) est, encore une fois, le 'é' personnage que j'ai envie de.

Malheureusement, dans les deux cas, suis-je en terminant avec une bonne chaîne de caractères qui s'affichent comme la chaîne littérale "déjeuner". Curieusement, les séquences d'octets à la fois semblent corrects.

OriginalL'auteur user162346 | 2009-10-29