La risposta ovvia è da usare, Charset.defaultCharset()
ma recentemente abbiamo scoperto che questa potrebbe non essere la risposta giusta. Mi è stato detto che il risultato è diverso dal set di caratteri predefinito reale utilizzato dalle classi java.io in diverse occasioni. Sembra che Java mantenga 2 set di set di caratteri predefiniti. Qualcuno ha qualche intuizione su questo problema?
Siamo stati in grado di riprodurre un caso fallito. È una specie di errore dell'utente, ma potrebbe comunque esporre la causa principale di tutti gli altri problemi. Ecco il codice,
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;
}
}
Il nostro server richiede un set di caratteri predefinito in Latin-1 per gestire alcune codifiche miste (ANSI / Latin-1 / UTF-8) in un protocollo legacy. Quindi tutti i nostri server funzionano con questo parametro JVM,
-Dfile.encoding=ISO-8859-1
Ecco il risultato su Java 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Qualcuno cerca di cambiare il runtime di codifica impostando file.encoding nel codice. Sappiamo tutti che non funziona. Tuttavia, questo apparentemente getta defaultCharset () ma non influisce sul set di caratteri predefinito reale utilizzato da OutputStreamWriter.
È un bug o una funzionalità?
EDIT: la risposta accettata mostra la causa principale del problema. Fondamentalmente, non puoi fidarti di defaultCharset () in Java 5, che non è la codifica predefinita utilizzata dalle classi I / O. Sembra che Java 6 risolva questo problema.