it-swarm.com.de

Codierungskonvertierung in java

Gibt es eine freie Java Bibliothek, mit der ich Zeichenfolgen in einer Codierung in eine andere Codierung konvertieren kann, etwa iconv ? Ich verwende = Java Version 1.3.

30
tropikalista

Sie benötigen keine Bibliothek, die über die Standardbibliothek hinausgeht - verwenden Sie einfach Charset . (Sie können einfach die String-Konstruktoren und die getBytes-Methoden verwenden, aber ich persönlich mag es nicht, nur mit den Namen von Zeichenkodierungen zu arbeiten. Zu viel Platz für Tippfehler.)

BEARBEITEN: Wie in den Kommentaren erwähnt, können Sie weiterhin Charset-Instanzen verwenden, jedoch die folgenden String-Methoden verwenden: neuer String (Byte, Zeichensatz) und String.getBytes (Zeichensatz) .

Siehe " RL-Codierung (oder: 'Was sind das?" %20 "Codes in URLs? ') ".

41
Jon Skeet

CharsetDecoder sollte das sein, wonach du suchst, nein?

Viele Netzwerkprotokolle und -dateien speichern ihre Zeichen mit einem byteorientierten Zeichensatz wie ISO-8859-1 (ISO-Latin-1).
Javas native Zeichenkodierung ist jedoch Unicode UTF16BE (16-Bit-UCS-Transformationsformat, Big-Endian-Byte-Reihenfolge).

Siehe Charset . Dies bedeutet nicht, dass UTF16 Der Standardzeichensatz ist (dh die Standardzuordnung zwischen Sequenzen von 16-Bit nicode-Code-Einheiten und Folgen von Bytes "):

Jede Instanz der Java virtuellen Maschine hat einen Standardzeichensatz, der einer der Standardzeichensätze sein kann oder nicht.
[US-ASCII, ISO-8859-1 Aka ISO-LATIN-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16]
Der Standardzeichensatz wird beim Start der virtuellen Maschine festgelegt und hängt in der Regel vom Gebietsschema und dem Zeichensatz ab, die vom zugrunde liegenden Betriebssystem verwendet werden.

Dieses Beispiel zeigt, wie Sie ISO-8859-1 Codierte Bytes in einem ByteBuffer in einen String in einem CharBuffer konvertieren und umgekehrt.

// 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) {
}
19
VonC

Ich möchte nur hinzufügen, dass, wenn der String ursprünglich mit der falschen Codierung codiert wurde, es möglicherweise unmöglich ist, ihn ohne Fehler in eine andere Codierung zu ändern. Die Frage besagt nicht, dass die Konvertierung hier von falscher Codierung zu korrekter Codierung erfolgt, aber ich persönlich bin auf diese Frage gestoßen, nur weil diese Situation so einfach ist, dass ich auch anderen auf den Fersen bin.

Diese Antwort in einer anderen Frage gibt eine Erklärung, warum die Konvertierung nicht immer zu korrekten Ergebnissen führt https://stackoverflow.com/a/2623793/4702806

2
wallabui

Es ist viel einfacher, wenn Sie sich Unicode als einen Zeichensatz vorstellen (was es eigentlich ist - es ist im Grunde genommen der nummerierte Satz aller bekannten Zeichen). Sie können es als UTF-8 (1-3 Bytes pro Zeichen abhängig) oder als UTF-16 (2 Bytes pro Zeichen oder 4 Bytes unter Verwendung von Ersatzpaaren) codieren.

Zurück im Nebel der Zeit Java verwendet UCS-2, um den Unicode-Zeichensatz zu codieren. Dies konnte nur 2 Bytes pro Zeichen verarbeiten und ist jetzt veraltet. Es war ein ziemlich offensichtlicher Hack, der hinzugefügt werden musste ersetzen Sie Paare und bewegen Sie sich auf UTF-16.

Viele Leute denken, sie hätten UTF-8 an erster Stelle verwenden sollen. Als Java ursprünglich geschrieben wurde, hatte Unicode sowieso weit mehr als 65535 Zeichen ...

0
Anon

UTF-8 und UCS-2/UTF-16 lassen sich relativ einfach über eine Bytereihenfolge am Dateianfang unterscheiden. Wenn dies existiert, ist es eine gute Wette, dass sich die Datei in dieser Codierung befindet - aber es ist keine absolute Gewissheit. Möglicherweise befindet sich die Datei auch in einer dieser Codierungen, weist jedoch keine Bytereihenfolge auf.

Ich weiß nicht viel über ISO-8859-2, aber ich wäre nicht überrascht, wenn fast jede Datei eine gültige Textdatei in dieser Kodierung wäre. Das Beste, was Sie tun können, ist es, es heuristisch zu überprüfen. In der Tat würde die Wikipedia-Seite darüber sprechen, dass nur Byte 0x7f ungültig ist.

Es gibt keine Idee, eine Datei "so wie sie ist" zu lesen und dennoch Text herauszuholen - eine Datei ist eine Folge von Bytes, daher müssen Sie eine Zeichencodierung anwenden, um diese Bytes in Zeichen zu decodieren.

Quelle durch Stapelüberlauf

0
brijesh k