Ich schreibe eine Webanwendung in der Google App Engine. Es ermöglicht den Benutzern, HTML-Code zu bearbeiten, der als .html
Datei im Blobstore gespeichert wird.
Ich verwende fetchData, um eines byte[]
der Zeichen in der Datei zurückzugeben. Ich versuche, in ein HTML zu drucken, damit der Benutzer den HTML-Code bearbeiten kann. Alles funktioniert super!
Hier ist jetzt mein einziges Problem:
Das Byte-Array weist beim Zurückkonvertieren in eine Zeichenfolge einige Probleme auf. Kluge Zitate und ein paar Charaktere sehen funky aus. (? 's oder japanische Symbole usw.) Insbesondere sehe ich mehrere Bytes mit negativen Werten, die das Problem verursachen.
Die intelligenten Anführungszeichen werden als -108
und -109
im Byte-Array zurückgegeben. Warum ist das so und wie kann ich die negativen Bytes dekodieren, um die richtige Zeichenkodierung anzuzeigen?
InputStream
und dann reinbyte[]
. Wenn ich jetzt versuche, denbyte[]
in String umzuwandeln (ich muss den Antworttext für Angriffe verwenden), bekomme ich wirklich lustige Charaktere voller intelligenter Anführungszeichen und Fragezeichen und was nicht. Ich glaube , Ihr Problem wie meine gleiche ist , wie wir beide es zu tunhtml
inbyte[]
. Können Sie mir bitte einen Rat geben?String str=new String(buffer, "Cp1252");
aber keine Hilfe benutzt.Antworten:
Das Byte-Array enthält Zeichen in einer speziellen Codierung (die Sie kennen sollten). Die Konvertierung in einen String ist wie folgt:
Übrigens: Die angezeigten Rohbytes werden möglicherweise als negative Dezimalstellen angezeigt, nur weil der Java-Datentyp
byte
signiert ist. Er deckt den Bereich von -128 bis 127 ab.Der Wert (-109) ist ein nicht druckbares Steuerzeichen in UNICODE. UTF-8 ist also nicht die richtige Codierung für diesen Zeichenstrom.
0x93
in "Windows-1252" ist das "intelligente Zitat", das Sie suchen, daher lautet der Java-Name dieser Codierung "Cp1252". Die nächste Zeile enthält einen Testcode:quelle
byte
Datentyp signiert ist. Die 'negativen' Werte sind nur Bytes mit dem höchstwertigen Bytesatz. Er erklärt auch, was der wahrscheinlichste Zeichensatz ist, den Sie verwenden sollten - Windows-1252. Sie sollten jedoch anhand des Kontexts oder der Konvention wissen, welchen Zeichensatz Sie verwenden müssen, ohne raten zu müssen.Java 7 und höher
Sie können Ihre gewünschte Codierung auch
String
alsCharset
Konstante von StandardCharsets an den Konstruktor übergeben . Dies kann sicherer sein, als die Codierung als zu übergebenString
, wie in den anderen Antworten vorgeschlagen.Zum Beispiel für die UTF-8-Codierung
quelle
Sie können dies versuchen.
quelle
Ausgabe
quelle
quelle
read
eine Ausnahme ausgelöst wird.Ich schlage vor
Arrays.toString(byte_array);
Es hängt von Ihrem Zweck ab. Zum Beispiel wollte ich ein Byte-Array genau so speichern, wie Sie es zum Zeitpunkt des Debuggens sehen können.
[1, 2, 3]
Wenn Sie genau denselben Wert speichern möchten, ohne die Bytes in das Zeichenformat zu konvertieren,Arrays.toString (byte_array)
tun Sie dies. Wenn Sie jedoch Zeichen anstelle von Bytes speichern möchten, sollten Sie verwendenString s = new String(byte_array)
. In diesem Falls
entspricht dies dem[1, 2, 3]
Zeichenformat.quelle
Die vorherige Antwort von Andreas_D ist gut. Ich möchte nur hinzufügen, dass überall dort, wo Sie die Ausgabe anzeigen, eine Schriftart und eine Zeichenkodierung vorhanden sind und einige Zeichen möglicherweise nicht unterstützt werden.
Gehen Sie folgendermaßen vor, um herauszufinden, ob Java oder Ihr Display ein Problem darstellt:
Java hat alle Zeichen, die es nicht verstehen kann, dem offiziellen Zeichen für unbekannte Zeichen zugeordnet. Wenn Sie ein '?' In der Ausgabe, die jedoch nicht 0xfffd zugeordnet ist, ist Ihre Anzeigeschrift oder -codierung das Problem, nicht Java.
quelle