La respuesta obvia es usar, Charset.defaultCharset()
pero recientemente descubrimos que esta podría no ser la respuesta correcta. Me dijeron que el resultado es diferente del conjunto de caracteres predeterminado real utilizado por las clases java.io en varias ocasiones. Parece que Java mantiene 2 juegos de caracteres predeterminados. ¿Alguien tiene alguna idea sobre este tema?
Pudimos reproducir un caso fallido. Es una especie de error del usuario, pero aún puede exponer la causa raíz de todos los demás problemas. Aquí está el 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;
}
}
Nuestro servidor requiere un juego de caracteres predeterminado en Latin-1 para manejar algunas codificaciones mixtas (ANSI / Latin-1 / UTF-8) en un protocolo heredado. Entonces todos nuestros servidores se ejecutan con este parámetro de JVM,
-Dfile.encoding=ISO-8859-1
Aquí está el resultado en Java 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Alguien intenta cambiar el tiempo de ejecución de la codificación configurando file.encoding en el código. Todos sabemos que eso no funciona. Sin embargo, esto aparentemente elimina defaultCharset () pero no afecta el juego de caracteres predeterminado real utilizado por OutputStreamWriter.
¿Es esto un error o una característica?
EDITAR: La respuesta aceptada muestra la causa raíz del problema. Básicamente, no puede confiar en defaultCharset () en Java 5, que no es la codificación predeterminada utilizada por las clases de E / S. Parece que Java 6 corrige este problema.