Comment Trouver le jeu de caractères par Défaut/de Codage en Java?

La réponse évidente est d'utiliser Charset.defaultCharset() mais nous avons récemment trouvé que ce serait peut-être pas la bonne réponse. On m'a dit que le résultat est différent de réel jeu de caractères par défaut utilisé par java.io classes à plusieurs reprises. Ressemble à Java garde de 2 ensembles de jeu de caractères par défaut. Quelqu'un aurait-il des idées sur ce problème?

Nous avons été en mesure de reproduire un cas d'échec. C'est une sorte d'erreur de l'utilisateur, mais il peut toujours exposer la cause de racine 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 requiert jeu de caractères par défaut dans le Latin-1 pour traiter avec un mélange de codage (ANSI/Latin-1/UTF-8) dans un héritage protocole. Donc, tous nos serveurs fonctionnent avec ce paramètre de 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 changer l'encodage d'exécution en paramètre le fichier.le codage dans le code. Nous savons tous qui ne fonctionne pas. Cependant, ce qui, apparemment, jette hors defaultCharset() mais cela n'affecte pas le vrai jeu de caractères par défaut utilisé par OutputStreamWriter.

Est-ce un bug ou fonctionnalité?

EDIT: La accepté de répondre montre la cause racine du problème. Fondamentalement, vous ne pouvez pas faire confiance defaultCharset() en Java 5, ce qui n'est pas l'encodage utilisé par défaut par les e/S des classes. Ressemble à Java 6 corrige ce problème.

  • C'est bizarre, depuis le defaultCharset utilise une variable statique qui est définie une seule fois (accoring à la docs - à VM de démarrage). Ce VM Vendeur utilisez-vous?
  • J'ai été en mesure de reproduire ce sur Java 5, à la fois sur le Soleil/Linux et Apple/mac OS X.
  • Ce qui explique pourquoi defaultCharset() ne pas mettre en cache le résultat. J'ai encore besoin de savoir ce qu'est le vrai jeu de caractères par défaut utilisé par IO classes. Il doit y avoir un autre jeu de caractères par défaut de cache quelque part d'autre.
  • Codeur, je suis encore en recherche sur le sujet. La seule chose que je sais, c'est que le jeu de caractères.defaulyCharset() n'est pas appelé de soleil.nio.cs.StreamEncoder dans la JVM 1.5. Dans la JVM 1.6 le jeu de caractères.defaulyCharset() la méthode est appelée donner les résultats escomptés. JVM 1.5 mise en œuvre de StreamEncoder est mise en cache de la précédente encodage, en quelque sorte.
InformationsquelleAutor ZZ Coder | 2009-11-17