Oczywistą odpowiedzią jest użycie, Charset.defaultCharset()
ale niedawno odkryliśmy, że może to nie być właściwa odpowiedź. Powiedziano mi, że wynik różni się od rzeczywistego domyślnego zestawu znaków używanego przez klasy java.io w kilku przypadkach. Wygląda na to, że Java zachowuje 2 zestawy domyślnego zestawu znaków. Czy ktoś ma jakieś spostrzeżenia w tej sprawie?
Udało nam się odtworzyć jeden przypadek niepowodzenia. To rodzaj błędu użytkownika, ale nadal może ujawnić główną przyczynę wszystkich innych problemów. Oto kod,
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;
}
}
Nasz serwer wymaga domyślnego zestawu znaków Latin-1, aby poradzić sobie z pewnym kodowaniem mieszanym (ANSI / Latin-1 / UTF-8) w starszym protokole. Wszystkie nasze serwery działają z tym parametrem maszyny JVM,
-Dfile.encoding=ISO-8859-1
Oto wynik na Javie 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Ktoś próbuje zmienić środowisko wykonawcze kodowania, ustawiając plik file.encoding w kodzie. Wszyscy wiemy, że to nie działa. Jednak to najwyraźniej wyrzuca defaultCharset (), ale nie wpływa na rzeczywisty domyślny zestaw znaków używany przez OutputStreamWriter.
Czy to błąd lub funkcja?
EDYCJA: Zaakceptowana odpowiedź przedstawia główną przyczynę problemu. Zasadniczo nie można ufać defaultCharset () w Javie 5, co nie jest domyślnym kodowaniem używanym przez klasy I / O. Wygląda na to, że Java 6 rozwiązuje ten problem.