sicuro di codifica Costruttori
Ottenere Java per notificare correttamente di errori di codifica è difficile.È necessario utilizzare il più dettagliato e, purtroppo, la meno utilizzato delle quattro Case costruttrici di alternative per ciascuna delle InputStreamReader
e OutputStreamWriter
ricevere un'eccezione appropriata su un difetto di codifica.
Per file di I/O, sempre assicurarsi di utilizzare sempre come secondo argomento sia OutputStreamWriter
e InputStreamReader
l'argomento encoder fantasia:
Charset.forName("UTF-8").newEncoder()
Ci sono altre possibilità ancora più elaborate, ma nessuno dei tre più semplice le possibilità funzionano per le eccezioni. Questi fanno:
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()
);
Per quanto riguarda la corsa con
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
Il problema è che che non utilizzerà il modulo encoder argomento completa per i flussi del personaggio, e così si sarà nuovamente perdere problemi di codifica.
Longer Esempio
Ecco un esempio più, questa gestire un processo invece di un file, dove promuoviamo due ingressi diversi byte flussi ed una corrente di uscita di byte tutto UTF-8 caratteri flussi con la gestione completa eccezioni:
// 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()
);
Ora avete tre carattere flussi che tutti sollevano un'eccezione in caso di errori di codifica, rispettivamente chiamati chars_into_his_stdin
, chars_from_his_stdout
, e chars_from_his_stderr
.
Questo è solo leggermente più complicato di quello che ti serve per il tuo problema, la cui soluzione ho dato nella prima metà di questa risposta. Il punto chiave è questo è l'unico modo per rilevare errori di codifica.
Basta non farmi iniziare a proposito di PrintStream
s eccezioni alimentari.
Questo non è sufficiente . È necessario anche un 'InputStreamReader (InputStream in, CharsetDecoder dec)', tale che l'ultimo argomento sia 'Charset.forName (" UTF-8 "). NewDecoder()'. – tchrist
Gli errori di codifica degli input verranno silenziati automaticamente se lo fai. – tchrist
Non è necessario un encoder. Il costruttore accetta una stringa, un set di caratteri o un codificatore in entrambe le classi di input/output. Non sei sicuro di cosa intendi con il tuo commento. Puoi elaborare, per favore? –