Frage

Gibt es eine Möglichkeit, um eine ANSI-Zeichenfolge in UTF mit Java zu konvertieren.

Ich habe einen benutzerdefinierten Serializer, die readUTF & writeUTF Methoden der Datainputstream-Klasse verwendet deserialisieren und serialze String. Wenn ich eine Zeichenfolge codiert in ANSI empfangen und zu lang ist, ~ 100000 Zeichen lange erhalte ich den Fehler;

  

Verursacht durch:   java.io.UTFDataFormatException:   codierte Zeichenfolge zu lang: 106.958 Bytes

Doch in meinen JUnit-Tests ich bin die Lage, eine Zeichenfolge mit 120000 ‚eine der erstellen und es funktioniert perfekt

Ich habe die folgenden Beiträge überprüft, aber immer noch Fehler aufweisen;

War es hilfreich?

Lösung

Dieser Fehler wird nicht durch Zeichenkodierung verursacht. Es bedeutet, dass die Länge der UTF-Daten ist falsch.

EDIT:. Gerade erkennen dies ein Schreibfehler ist, nicht Fehler beim Lesen

Die UTF Länge ist nur 2 Bytes, so dass es nur 64K UTF-8-Byte halten kann. Sie sind zum Schreiben 100K versuchen, es nicht zur Arbeit gehen.

Diese Grenze ist hartcodiert und keine Möglichkeit, dies zu umgehen,

if (utflen > 65535)
    throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

Andere Tipps

byte[] asciiBytes = ...;
String unicode = new String(asciiBytes, "US-ASCII");
byte[] utfBytes = unicode.getBytes("UTF-8");

Welche ANSI-Codepage ? Es gibt viele verschiedene Zeichencodierungen, die alle auf „ANSI“ beziehen. Die DOS-Codepage ist 437 (ohne die Zeichnung Symbole). Wenn Sie Codepage verwenden 850, wird diese Arbeit:

String unicode = new String(bytes, "IBM850");

(wobei bytes ist ein Array mit dem ANSI-Zeichen). Danach werden Sie diese Zeichenfolge in ein Byte-Array mit einer beliebigen Codierung unicode.getBytes(encoding) umwandeln kann.

Windows verwendet oft die Codepage 1252 (Verwendung "windows-1252" für die).

ZZ Coder bereits die Frage beantwortet, aber ich habe eine ausführlichere Erklärung geschrieben und was darauf hindeutet, eine Abhilfe auf Blog . Grundsätzlich ist das Problem in Dataoutputstream, weil es die beschreibbare String zu 64KB einschränkt. Es gibt noch andere mögliche Abhilfen das Problem byStep, einige ohne funktionieren könnten das tatsächliche binäre Datenformat zu brechen man mit ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top