EDIT: J'ai été convaincu que cette question est quelque peu non-sensée. Merci à ceux qui ont répondu. Je peux poster une question de suivi plus spécifique.Java 1.6 L'encodage de Windows-1252 échoue sur 3 caractères
Aujourd'hui, j'investissais des problèmes d'encodage et écrit ce test unitaire pour isoler une base repro cas:
int badCount = 0;
for (int i = 1; i < 255; i++) {
String str = "Hi " + new String(new char[] { (char) i });
String toLatin1 = new String(str.getBytes("UTF-8"), "latin1");
assertEquals(str, new String(toLatin1.getBytes("latin1"), "UTF-8"));
String toWin1252 = new String(str.getBytes("UTF-8"), "Windows-1252");
String fromWin1252 = new String(toWin1252.getBytes("Windows-1252"), "UTF-8");
if (!str.equals(fromWin1252)) {
System.out.println("Can't encode: " + i + " - " + str +
" - encodes as: " + fromWin1252);
badCount++;
}
}
System.out.println("Bad count: " + badCount);
La sortie:
Can't encode: 129 - Hi ? - encodes as: Hi ?? Can't encode: 141 - Hi ? - encodes as: Hi ?? Can't encode: 143 - Hi ? - encodes as: Hi ?? Can't encode: 144 - Hi ? - encodes as: Hi ?? Can't encode: 157 - Hi ? - encodes as: Hi ?? Can't encode: 193 - Hi Á - encodes as: Hi ?? Can't encode: 205 - Hi Í - encodes as: Hi ?? Can't encode: 207 - Hi Ï - encodes as: Hi ?? Can't encode: 208 - Hi ? - encodes as: Hi ?? Can't encode: 221 - Hi ? - encodes as: Hi ?? Bad count: 10
1.6.0_07 sous Mac JDK OS 10.6. Mon
Latin1 symétrique allie encode tous les 254 caractères. Windows-1252 non. Les trois caractères imprimables (193, 205, 207) sont les mêmes codes dans Latin1 et Windows-1252, donc je ne m'attendrais à aucun problème.
Quelqu'un peut-il expliquer ce comportement? Est-ce un bug JDK?
- James
Le code que vous publiez n'a aucun sens (obtenir des données codées UTF-8 à partir d'une chaîne et les interpréter * comme s'il s'agissait de latin1 *). Par conséquent, il est assez difficile de suivre ce que vous essayez de faire. –
J'ai des données encodées en UTF-8 que j'ai besoin de transcoder en Windows-1252. Dans mon système de production, j'ai remarqué que cela échouait sur le personnage 193, j'ai donc écrit ce cas de repro de base et à ma grande surprise, j'ai découvert que ces 10 caractères ne codaient pas symétriquement entre Windows-1252 et UTF-8. Notez que tous les 254 caractères peuvent être encodés entre UTF-8 et Latin1. D'où ma surprise et ma confusion. Est ce que ça aide? –
Qu'est-ce que ** exactement ** voulez-vous dire par "transcoder"? Voulez-vous les octets codés Windows-1252 qui représentent les mêmes glyphes? Si c'est le cas, alors vous devez être conscient que ce n'est tout simplement pas possible dans tous les cas, car UTF-8 peut représenter tous les caractères Unicode, alors que Windows-1252 ne peut évidemment pas le faire. –