A resposta óbvia é usar, Charset.defaultCharset()
mas descobrimos recentemente que essa pode não ser a resposta certa. Disseram-me que o resultado é diferente do conjunto de caracteres padrão real usado pelas classes java.io em várias ocasiões. Parece que o Java mantém 2 conjuntos de charset padrão. Alguém tem alguma ideia sobre este assunto?
Conseguimos reproduzir um caso de falha. É uma espécie de erro do usuário, mas ainda pode expor a causa raiz de todos os outros problemas. Aqui está o código,
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;
}
}
Nosso servidor requer conjunto de caracteres padrão em Latin-1 para lidar com alguma codificação mista (ANSI / Latin-1 / UTF-8) em um protocolo legado. Portanto, todos os nossos servidores funcionam com este parâmetro JVM,
-Dfile.encoding=ISO-8859-1
Aqui está o resultado em Java 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Alguém tenta alterar o tempo de execução da codificação definindo file.encoding no código. Todos nós sabemos que isso não funciona. No entanto, isso aparentemente joga fora defaultCharset (), mas não afeta o charset padrão real usado por OutputStreamWriter.
Isso é um bug ou recurso?
EDIT: A resposta aceita mostra a causa raiz do problema. Basicamente, você não pode confiar em defaultCharset () em Java 5, que não é a codificação padrão usada pelas classes de E / S. Parece que o Java 6 corrige esse problema.