Frage

Gibt es eine freie Java-Bibliothek, die ich verwenden kann Zeichenfolge in einer Kodierung in einer anderen Kodierung, so etwas wie iconv ? Ich bin mit Java-Version 1.3.

War es hilfreich?

Lösung

Sie brauchen nicht eine Bibliothek über den Standard ein - nur einen href verwenden <= „https://docs.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html“ rel = "nofollow noreferrer"> Charset . (Sie können nur die String Konstrukteure und getBytes Methoden verwenden, aber persönlich mag ich nicht nur mit den Namen der Zeichenkodierungen zu arbeiten. Zu viel Raum für Fehler.)

EDIT: Wie in den Kommentaren darauf hingewiesen, können Sie immer noch Charset-Instanzen verwenden, haben aber die einfache Bedienung der String-Methoden: new String (Bytes, charset) und String. getBytes (charset) .

Siehe „ URL-Kodierung (oder:‚Was sind diese "%20" -Codes in URLs? ') “.

Andere Tipps

CharsetDecoder sollten das, was Sie suchen, nicht wahr?

Viele Netzwerkprotokolle und Dateien speichern ihre Charaktere mit einem byteorientierte Zeichensatz wie ISO-8859-1 (ISO-Latin-1).
Allerdings Java native Zeichencodierung ist Unicode Utf16BE (Sechzehn- bit UCS Transformation Format, big-endian-Byte-Reihenfolge).

Siehe Charset . Das bedeutet nicht, UTF16 ist der Standard-charset (dh: der Standard "Mapping zwischen Sequenzen von sechzehn-Bit Unicode-Codeeinheiten und Sequenzen von Bytes"):

  

Jede Instanz der virtuellen Java-Maschine verfügt über einen Standard-Zeichensatz, der nicht eine des Standard charsets sein kann.
  [US-ASCII, ISO-8859-1 auch bekannt als ISO-LATIN-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16]
  Der Standard-charset wird während der virtuellen Maschine Inbetriebnahme bestimmt und in der Regel abhängig von der locale und charset durch das zugrunde liegende Betriebssystem verwendet wird.

Dieses Beispiel zeigt, wie ISO-8859-1 codiertes Bytes in einem ByteBuffer in eine Zeichenfolge in einem CharBuffer und umgekehrt konvertieren.

// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();

try {
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
    // The new ByteBuffer is ready to be read.
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
    // The new ByteBuffer is ready to be read.
    CharBuffer cbuf = decoder.decode(bbuf);
    String s = cbuf.toString();
} catch (CharacterCodingException e) {
}

Ich möchte nur hinzufügen, dass, wenn der String ursprünglich die falsche Verwendung codiert ist codiert, es unmöglich sein, könnte es zu einer anderen Codierung ohne Fehler zu ändern. Die Frage gibt nicht an, dass die hier Umwandlung von falscher Codierung Codierung zu korrigieren, aber ich stolperte persönlich auf diese Frage nur wegen dieser Situation so nur Köpfe wie auch für die andere nach oben.

Diese Antwort in anderer Frage gibt eine Erklärung, warum die Umwandlung korrekte Ergebnisse nicht immer nachgeben https://stackoverflow.com/a/2623793/4702806

Es ist sehr viel einfacher, wenn Sie von Unicode als Zeichensatz denken (was es eigentlich ist - es ist sehr grundsätzlich die nummerierte Menge aller bekannten Zeichen ist). Sie können es als UTF-8-Codierung (1-3 Bytes pro Zeichen abhängig) oder vielleicht UTF-16 (2 Bytes pro Zeichen oder 4 Bytes unter Verwendung von Surrogat-Paaren).

Zurück im Nebel der Zeit Java verwendete UCS-2 verwenden, um den Unicode-Zeichensatz zu kodieren. Dies könnte nur 2 Bytes pro Zeichen handhaben und ist mittlerweile veraltet. Es war ein ziemlich offensichtlich Hack Ersatzpaare hinzufügen und UTF-16 nach oben bewegen.

Eine Menge Leute denken, dass sie gebrauchte UTF-8 in erster Linie haben sollten. Wenn Java Unicode ursprünglich geschrieben wurde ohnehin weit mehr als 65.535 Zeichen hatte ...

UTF-8 und UCS-2 / UTF-16 kann einigermaßen leicht am Anfang der Datei über eine Bytereihenfolgemarkierung unterschieden werden. Wenn diese vorhanden ist, dann ist es eine ziemlich gute Wette, dass die Datei in dieser Codierung ist - aber es ist keine tote Gewissheit. Sie können auch feststellen, dass die Datei in eines dieser Kodierungen ist, aber keine Bytereihenfolgemarkierung hat.

Ich weiß nicht viel über die ISO-8859-2, aber ich wäre nicht überrascht, wenn fast jede Datei eine gültige Textdatei in dieser Codierung ist. Am besten Sie werden in der Lage sein, ist es heuristisch zu tun zu überprüfen. Tatsächlich sprechen die Wikipedia-Seite über sie würde vorschlagen, dass nur Byte 0x7f ungültig ist.

Es gibt keine Idee zum Lesen einer Datei „wie es ist“ und noch Text raus -. Eine Datei ist eine Folge von Bytes, so dass Sie ein Zeichencodierung anzuwenden, um diejenigen Bytes in Zeichen zu entschlüsseln

Quelle von Stackoverflow

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