seguras de codificación de constructores
Obtención de Java para notificarle adecuadamente de errores de codificación es complicado.Debe utilizar el más detallado y, por desgracia, la menos utilizado de los cuatro contructors alternos para cada uno de InputStreamReader
y OutputStreamWriter
a recibir una excepción adecuada en una codificación fallo.
Para archivo de E/S, siempre asegúrese de utilizar siempre el segundo argumento de tanto OutputStreamWriter
y InputStreamReader
el argumento codificador de lujo:
Charset.forName("UTF-8").newEncoder()
Hay otras posibilidades, incluso más elegante, pero ninguno de los tres más sencillo las posibilidades funcionan para la entrega de excepciones. Estos hacen:
OutputStreamWriter char_output = new OutputStreamWriter(
new FileOutputStream("some_output.utf8"),
Charset.forName("UTF-8").newEncoder()
);
InputStreamReader char_input = new InputStreamReader(
new FileInputStream("some_input.utf8"),
Charset.forName("UTF-8").newDecoder()
);
En cuanto a correr con
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
El problema es que eso no va a utilizar la forma completa argumento codificador para el personaje arroyos, y por lo que volverá a perderse problemas de codificación.
más largo Ejemplo
He aquí un ejemplo más, éste la gestión de un proceso en lugar de un archivo, donde se promueve dos entradas diferentes bytes de arroyos y un flujo de bytes de salida todo a UTF-8 streams de caracteres con el manejo de excepciones completa:
// this runs a perl script with UTF-8 STD{IN,OUT,ERR} streams
Process
slave_process = Runtime.getRuntime().exec("perl -CS script args");
// fetch his stdin byte stream...
OutputStream
__bytes_into_his_stdin = slave_process.getOutputStream();
// and make a character stream with exceptions on encoding errors
OutputStreamWriter
chars_into_his_stdin = new OutputStreamWriter(
__bytes_into_his_stdin,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newEncoder()
);
// fetch his stdout byte stream...
InputStream
__bytes_from_his_stdout = slave_process.getInputStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stdout = new InputStreamReader(
__bytes_from_his_stdout,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
// fetch his stderr byte stream...
InputStream
__bytes_from_his_stderr = slave_process.getErrorStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stderr = new InputStreamReader(
__bytes_from_his_stderr,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
Ahora usted tiene tres streams de caracteres que todos aumentan excepción de errores de codificación, respectivamente llamados chars_into_his_stdin
, chars_from_his_stdout
, y chars_from_his_stderr
.
Esto es solo un poco más complicado que lo que necesita para su problema, cuya solución di en la primera mitad de esta respuesta. El punto clave es que esta es la única forma de detectar errores de codificación.
Simplemente no me digas acerca de PrintStream
s comiendo excepciones.
Eso no es suficiente . También necesita un 'InputStreamReader (InputStream in, CharsetDecoder dec)', de modo que el último argumento sea 'Charset.forName (" UTF-8 "). NewDecoder()'. – tchrist
Los errores de codificación de entrada se eliminarán silenciosamente si lo hace así. – tchrist
No hay necesidad de un codificador. El constructor acepta una Cadena, un Juego de Caracteres o un Codificador en las clases de Entrada/Salida. No estoy seguro de lo que quieres decir con tu comentario. ¿Puedes elaborar, por favor? –