Die offensichtliche Antwort ist zu verwenden, Charset.defaultCharset()
aber wir haben kürzlich herausgefunden, dass dies möglicherweise nicht die richtige Antwort ist. Mir wurde gesagt, dass sich das Ergebnis von dem tatsächlichen Standardzeichensatz unterscheidet, der von java.io-Klassen bei mehreren Gelegenheiten verwendet wird. Java behält anscheinend zwei Sätze von Standardzeichensätzen bei. Hat jemand irgendwelche Einsichten zu diesem Thema?
Wir konnten einen Fehlerfall reproduzieren. Es ist eine Art Benutzerfehler, aber es kann immer noch die Hauptursache für alle anderen Probleme aufdecken. Hier ist der 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;
}
}
Unser Server benötigt einen Standardzeichensatz in Latin-1, um mit einer gemischten Codierung (ANSI / Latin-1 / UTF-8) in einem Legacy-Protokoll umgehen zu können. Alle unsere Server werden also mit diesem JVM-Parameter ausgeführt.
-Dfile.encoding=ISO-8859-1
Hier ist das Ergebnis auf Java 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Jemand versucht, die Codierungslaufzeit zu ändern, indem er die Datei.encoding im Code festlegt. Wir alle wissen, dass das nicht funktioniert. Dies löst jedoch anscheinend defaultCharset () aus, hat jedoch keinen Einfluss auf den von OutputStreamWriter verwendeten tatsächlichen Standardzeichensatz.
Ist das ein Fehler oder eine Funktion?
BEARBEITEN: Die akzeptierte Antwort zeigt die Grundursache des Problems. Grundsätzlich können Sie defaultCharset () in Java 5 nicht vertrauen. Dies ist nicht die Standardcodierung, die von E / A-Klassen verwendet wird. Java 6 behebt dieses Problem anscheinend.