Frage

Gibt es eine einfache Möglichkeit, den Umgang mit Textcodierung Probleme zu vermeiden?

War es hilfreich?

Lösung

Sie können nicht wirklich vermeiden mit der Textcodierung Fragen beschäftigen, aber es gibt bestehende Lösungen:

Sie müssen nur die Codierung Ihrer Wahl wählen.

Andere Tipps

Wenn Sie beginnen mit einem String-off Sie auch folgendes tun:

new ByteArrayInputStream(inputString.getBytes("UTF-8"))

Nun, ein Reader beschäftigt sich mit Zeichen und ein Input beschäftigt sich mit Bytes. Die Codierung gibt an, wie Sie Ihre Zeichen als Bytes repräsentieren, so dass Sie das Problem nicht wirklich ignorieren. Wie zur Vermeidung von Problemen, meiner Meinung nach ist: mit ihm ein charset (z „UTF-8“) und halten wählen.

In Bezug auf, wie man es wirklich tun, als darauf hingewiesen wurde, " die offensichtlichen Namen für diese Klassen sind ReaderInputStream und WriterOutputStream . " überraschenderweise, obwohl die 'entgegengesetzte' Klassen " diese sind nicht in der Java-Bibliothek enthalten", Input und Output sind enthalten.

So viele Menschen haben mit ihren eigenen Implementierungen kommen, einschließlich Apache Commons IO . Je nach Lizenzfragen, werden Sie wahrscheinlich in der Lage sein, die commons-io-Bibliothek in einem Projekt gehört, oder sogar einen Teil des Quellcodes kopieren (die herunterladbaren ist hier ).

Wie Sie sehen können, Dokumentation beiden Klassen, heißt es, dass ‚alle charset Codierungen von der JRE unterstützt werden korrekt behandelt‘.

N. B. Ein Kommentar zu einem der anderen Antworten hier erwähnt diesen Fehler . Aber das wirkt sich auf die Apache Ant ReaderInputStream Klasse ( hier ) nicht die Apache Commons IO ReaderInputStream Klasse.

Auch zur Kenntnis, dass, wenn Sie mit einem String Anfahren sind, können Sie ein String Erstellen überspringen und einen Inputstream in einem Schritt erstellen org.apache.commons.io.IOUtils von Commons IO wie folgt:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

Natürlich müssen Sie noch über die Textkodierung denken, aber zumindest die Umwandlung in einem Schritt geschieht.

Verwendung:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

Auf diese Weise zu String nicht eine Vorauszahlung Umwandlung erfordert und dann byte[], welche Speicher viel mehr Heap reserviert, falls der Bericht groß. Er wandelt auf Bytes on the fly als der Strom gelesen wird, direkt von dem String.

Es verwendet CharSequenceInputStream von Apache Commons IO-Projekt.

Die offensichtlichen Namen für diese Klassen sind ReaderInputStream und WriterOutputStream. Leider gibt es in der Java-Bibliothek diese sind nicht enthalten. Doch Google ist dein Freund.

Ich bin nicht sicher, dass sie alle Textcodierung Probleme umgehen, werden, der alptraum sind.

Es gibt eine RFE, aber es ist geschlossen, nicht beheben .

Sie können nicht zur Textcodierung Probleme vermeiden, aber Apache commons-io hat

Beachten Sie das sind die Bibliotheken von koders.com in Peters Antwort genannt sind, nur Links in die Bibliothek anstelle des Quellcodes.

Sind Sie versuchen, den Inhalt eines Reader zu einem OutputStream zu schreiben? Wenn ja, werden Sie leichter Einwickeln der OutputStream in einem OutputStreamWriter haben und die chars vom Reader zum Writer schreiben, anstatt zu versuchen, den Leser zu einem InputStream zu konvertieren:

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block

Eine Warnung, wenn WriterOutputStream mit - es nicht immer behandeln binäre Daten in eine Datei zu schreiben richtig / die gleiche wie eine reguläre Ausgabe-Stream. Ich hatte ein Problem mit diesem, das mir einer Weile dauerte bis zu verfolgen.

Wenn Sie können, ich würde empfehlen, einen Ausgangsstrom als Basis verwendet wird, und wenn Sie Strings schreiben müssen, verwenden Sie einen Output Wrapper um den Strom, es zu tun. Es ist viel zuverlässiger Text Bytes als die andere Art und Weise zu konvertieren um, was wahrscheinlich ist, warum WriterOutputStream kein Bestandteil der Standard-Java-Bibliothek ist

Sie können mit Cactoos (keine statischen Methoden, nur Objekte):

Sie können die andere Art und Weise umwandeln um auch:

Für eine Zeichenkette in einem Strom Lesen mit genau dem, was Java liefert.

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top