La réponse évidente est d'utiliser Charset.defaultCharset()
mais nous avons récemment découvert que ce n'était peut-être pas la bonne réponse. On m'a dit que le résultat est différent du jeu de caractères par défaut réel utilisé par les classes java.io à plusieurs reprises. On dirait que Java conserve 2 ensembles de jeux de caractères par défaut. Quelqu'un a-t-il des idées sur ce problème?
Nous avons pu reproduire un cas d'échec. C'est une sorte d'erreur de l'utilisateur, mais cela peut toujours exposer la cause première de tous les autres problèmes. Voici le code,
public class CharSetTest {
public static void main(String[] args) {
System.out.println("Default Charset=" + Charset.defaultCharset());
System.setProperty("file.encoding", "Latin-1");
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("Default Charset in Use=" + getDefaultCharSet());
}
private static String getDefaultCharSet() {
OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
String enc = writer.getEncoding();
return enc;
}
}
Notre serveur nécessite un jeu de caractères par défaut en Latin-1 pour gérer un encodage mixte (ANSI / Latin-1 / UTF-8) dans un protocole hérité. Donc tous nos serveurs fonctionnent avec ce paramètre JVM,
-Dfile.encoding=ISO-8859-1
Voici le résultat sur Java 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Quelqu'un essaie de modifier le runtime d'encodage en définissant le fichier file.encoding dans le code. Nous savons tous que cela ne fonctionne pas. Cependant, cela annule apparemment defaultCharset () mais n'affecte pas le jeu de caractères par défaut réel utilisé par OutputStreamWriter.
Est-ce un bug ou une fonctionnalité?
EDIT: La réponse acceptée montre la cause première du problème. Fondamentalement, vous ne pouvez pas faire confiance à defaultCharset () dans Java 5, qui n'est pas l'encodage par défaut utilisé par les classes d'E / S. Il semble que Java 6 corrige ce problème.