Konvertieren Latin-1 Inhalt InputStream in UTF-8-String
Brauche ich zum konvertieren den Inhalt eines InputStream in einen String. Die Schwierigkeit ist hier die input-Codierung, nämlich von Latin-1. Ich habe versucht, verschiedene Ansätze und code-snippets mit String, getBytes, char[], etc. um die Codierung gerade, aber nichts schien zu funktionieren.
Schließlich kam ich mit der funktionierenden Lösung unten. Dieser code jedoch scheint etwas Ausführlicher zu mir, auch für Java. Also die Frage ist hier:
Ist es ein einfacher und eleganter Ansatz, um zu erreichen, was wird hier gemacht?
private String convertStreamToStringLatin1(java.io.InputStream is)
throws IOException {
String text = "";
//setup readers with Latin-1 (ISO 8859-1) encoding
BufferedReader i = new BufferedReader(new InputStreamReader(is, "8859_1"));
int numBytes;
CharBuffer buf = CharBuffer.allocate(512);
while ((numBytes = i.read(buf)) != -1) {
text += String.copyValueOf(buf.array(), 0, numBytes);
buf.clear();
}
return text;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, ein paar Kritikpunkte an dem Ansatz, den Sie genommen haben, schon. Sie sollten nicht unnötigerweise ein NIO
CharBuffer
wenn Sie nur wollen, einechar[512]
. Sie brauchen nicht zuclear
der Puffer in jeder iteration entweder.Sollten Sie auch wissen, dass nur constructing ein
String
mit diesen Argumenten wird die gleiche Wirkung haben, wie der Konstruktor auch die Daten kopiert.Können Sie eine dynamische
ByteArrayOutputStream
, die wächst, einen internen Puffer, um Platz für alle Daten. Sie können dann die gesamtebyte[]
austoByteArray
zu Dekodieren, die in einemString
.Der Vorteil ist, dass das zurückstellen der Decodierung bis zum Ende vermeidet Decodierung Fragmente einzeln, während die, die arbeiten können für einfache Zeichensätze wie ASCII oder ISO-8859-1, wird es nicht Arbeit an multi-byte-Programme wie UTF-8 und UTF-16. Dies bedeutet, es ist einfacher änderung der Zeichenkodierung in der Zukunft, da der code erfordert keine änderung.
Sehe ich nicht, wie es könnte sein, viel einfacher. Ich Tat dies ein wenig anders einmal.. wenn du schon einen String hast, kannst du dies tun:
So etwas wie diese könnten auch arbeiten:
EDIT: ich sollte hinzufügen, ist dies wirklich nur eine alternative zu Ihren bereits funktionierenden Lösung. Wenn es um die Umwandlung von Streams in Java ist es nicht viel einfacher, so gehen für Sie. 🙂
reader.readLine
; es wird anfügen eines trailing -\n
, das nicht da war ursprünglich. Darüber hinausBufferedReader
wird automatisch der default system encoding. Es ist eine bessere Idee, nur konstruieren Sie dieInputStreamReader
als mitStandardCharsets.ISO_8859_1
, so können Sie nur verwendenStringBuilder.toString
in einem Schritt erwerben die richtig decodierten string.Wenn Sie nicht wollen, um auszuloten, es selbst haben, könnten Sie einen Blick auf die apache-commons-io-Projekt, IOUtils.toString(InputStream input, String encoding), die scheint, zu tun, was Sie wollen. Ich habe nicht versucht, die Methode selbst aber die java-doc-Staaten "Erhalten Sie den Inhalt der einen InputStream als eine Zeichenfolge mit der angegebenen Zeichencodierung."
Guave's IO-Paket ist wirklich schön, auf diese Weise.
oder aus einem stream
Ich habe gerade herausgefunden, dass diese Antwort auf die Frage Lesen/konvertieren ein InputStream in einen String angewendet werden können, um mein problem, siehe code unten. Wie auch immer, ich Schätze sehr die Antworten, die Sie gegeben haben, so weit.
So, in Reihenfolge zu Kodieren von Latin-1, rufen Sie es wie folgt:
Scanner
intern kompiliert eine regexPattern
für das Trennzeichen. Diese Methode ist ja interessant und die nette, aber wohl auch nicht ratsam.Scanner
. In der Antwort, die du verlinkt sind, dass Sie es gut... ein dummScanner
trick.