Sicher Encoding Konstrukteurs
Java Erste richtig Sie von Codierungsfehler benachrichtigen ist schwierig.Sie müssen die wortreichste verwenden und, ach, die mindestens der vier alternativen contructors verwendet für jede InputStreamReader
und OutputStreamWriter
eine richtige Ausnahme auf eine Codierung Glitch zu empfangen.
Für Datei-I/O, immer darauf achten, immer als das zweite Argument zu verwenden, sowohl auf OutputStreamWriter
und InputStreamReader
die Phantasie Encoder Argument:
Charset.forName("UTF-8").newEncoder()
Es gibt andere auch ausgefallenere Möglichkeiten, aber keiner der drei einfachere Möglichkeiten arbeiten für die Ausnahmeübergabe. Dies tut:
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()
);
Wie für den Betrieb mit
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
Das Problem ist, dass das nicht das volle Encoder Argument Formular verwendet wird für die Zeichenströme, und so werden Sie wieder Codierung Probleme verpassen.
Längeres Beispiel
hier ein längeres Beispiel, das man einen Prozess statt eine Datei verwalten, wo wir zwei verschiedene Eingänge fördern Ströme und einen Ausgang Bytedatenstream alle auf UTF-8-Zeichenbytes Strom mit Exception Handling absichern:
// 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()
);
Jetzt haben Sie drei Zeichenströme, die alle Ausnahme auf Codierungsfehler erhöhen bzw. chars_into_his_stdin
, chars_from_his_stdout
und chars_from_his_stderr
genannt.
Das ist nur etwas komplizierter als das, was Sie für Ihr Problem brauchen, dessen Lösung ich in der ersten Hälfte dieser Antwort gegeben habe. Der entscheidende Punkt ist, dass dies die einzige Möglichkeit ist, Codierungsfehler zu erkennen.
Nur nicht über mich starten PrintStream
s essen Ausnahmen.
Das ist nicht genug . Sie benötigen auch einen 'InputStreamReader (InputStream in, CharsetDecoder dec)', so dass das letzte Argument 'Charset.forName (" UTF-8 "). NewDecoder()' ist. – tchrist
Eingabekodierungsfehler werden automatisch gelöscht, wenn Sie dies tun. – tchrist
Es ist kein Encoder erforderlich. Der Konstruktor akzeptiert entweder einen String, einen Zeichensatz oder einen Encoder in den beiden Input/Output-Klassen. Nicht sicher, was du mit deinem Kommentar meinst. Können Sie bitte näher ausführen? –