2010-12-14 8 views
0

Das Problem, das ich lösen möchte, ist die Konvertierung zwischen Unicode-Speicherarten. Wie ich es verstehe, kann ein Zeichen in UTF-8 durch 1 bis 4 Bytes von Daten repräsentiert werden, während ein Zeichen in UTF-16 in 1-2, zwei Bytes Datenblöcken dargestellt werden kann. Diese variable Länge bedeutet, dass es ein Schmerz ist, zwischen den beiden zu konvertieren und etwas zu produzieren, das in der englischen Sprache vernünftig ist.Java-Bibliotheken zum Konvertieren zwischen Zeichenkodierungen

Nach was ich suche ist eine Bibliothek, die mir eine Sprache oder ein Gebietsschema und einen Speichermechanismus (UTF-8 usw.) spezifizieren lassen und es ein vernünftigeres Ergebnis erzeugen lassen würde. Träume ich in den Wolken?

+1

Was genau meinen Sie mit "vernünftig in englischer Sprache"? Ob es in Englisch sinnvoll ist, spielt für die Codierung keine Rolle. Wenn Sie nur von einer Codierung in eine andere konvertieren müssen, dann ist die Antwort von Herms richtig. –

+0

Ich weiß, es ist irrelevant für die Codierung. Ich möchte etwas mehr tun, als nur von einer Codierung in eine andere zu konvertieren. Ich möchte in eine andere Kodierung für ein Gebietsschema konvertieren und dann ein Ergebnis erhalten, das vernünftig ist (dh Sie können es in einem englischen Wörterbuch nachschlagen, wenn das Gebietsschema eine englische Sprache darstellt), – stevebot

Antwort

3

Ist String.getBytes(String charsetname) nicht ausreichend?

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#getBytes(java.lang.String)

Damit können Sie das rohe Bytes eines String in einer bestimmten Codierung erhalten.

String hat einen [Konstruktor] [2], der auch ein Byte-Array und einen Charset-Namen benötigt, damit Sie das zum Dekodieren verwenden können.

[2]: http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String (byte [], java.lang.String)

+0

Ja, nein, das die rohen Bytes konvertiert Welche Kodierung du auch spezifizierst, aber so weit ich es verstehe, ist dumm. Ich meine, es geht nicht darum, die beste Darstellung in der englischen Sprache der utf-8-Zeichenfolge "Hallo" in utf-16 zu erzeugen. – stevebot

+0

Ich sage, Sie nehmen Ihre UTF-8-Zeichenfolge und erstellen Sie einen String daraus. Verwenden Sie dann getBytes(), um diese Zeichenfolge in die gewünschten UTF-16-Bytes zu konvertieren (oder eine andere Kombination von Eingabe/Ausgabe, die Sie haben). – Herms

+0

Seltsam, mein 2. Link zeigt sich als Link in der Vorschau, aber nicht auf der eigentlichen Seite. – Herms

2

Sie können Bytes in einer Codierung in eine Java-Zeichenfolge über den Konstruktor String (byte [], Charset) konvertieren. Unterstützte Zeichensätze sind in java.nio.charset.Charset aufgelistet.

Sie können dann zurück in Bytes mit einer anderen Codierung mit String.getBytes(CharSet) konvertieren.

Zum Beispiel:

byte[] bytesIn = ...; 
String s = new String(bytesIn, Charset.forName("UTF-8"); 
byte[] bytesOut = s.getBytes(Charset.forName("UTF-16")) 
2

Es ist sinnvoll für viele Zeichensätze. Es gibt immer noch einige, die nicht in Unicode passen, aber nicht viele.

Denken Sie zunächst daran, dass die Bytes keine Zeichen sind, um mit Zeichen umzugehen, die Sie konvertieren müssen. In der Regel besteht die einfachste Möglichkeit darin, einen Byte-Stream in einen Reader (oder Writer) zu schreiben Kodier-/Dekodierungs-Set.

Für eine Liste der direkt unterstützten Kodierungen, here's what comes with the JVM.

Der Schlüssel besteht nicht darin, Standard-Leser und -Schreiber zu verwenden, da sie die Codierung der Plattform verwenden. Wählen Sie stattdessen eine Kodierung. UTF-8 hat eine gute Plattengröße, schlechte Codier-/Decodierleistung; während UTF-32 ist schrecklich auf die Größe der Festplatte und exzellent auf Encoding/Decoding-Leistung. UTF-16 ist so etwas wie ein Kompromiss. Alle UTF-basierten Kodierungen optimieren die Handhabung von ASCII-Zeichen etwas effizienter, so dass UTF-8 UTF-16 schlägt, wenn Sie nur mit ASCII arbeiten.

Beachten Sie, dass Sie keine Bytes in einen neuen Zeichensatz konvertieren können, sie werden in den neuen Zeichensatz "gegossen". Wenn Sie also Bytes in einen neuen Zeichensatz konvertieren möchten, müssen Sie sie in Strings oder Characters umwandeln und die Bytes des Strings im neuen Zeichensatz abfragen.

Eine Möglichkeit, einen Byte-Stream als InputStream mit einem eigenen angegebenen Zeichensatz zu lesen, ist die Verwendung eines InputStreamReader constructed with an alternate character set. Ebenso müssen Sie einen OutputStreamWriter verwenden, der mit einem alternativen Zeichensatz erstellt wurde.

Alle Dateien, die nicht direkt verwaltet werden, sollten den Plattform-Zeichensatz verwenden (da dies wahrscheinlich der Fall ist) und in den Zeichensatz der Wahl konvertiert werden, wenn sie gespeichert oder in das Programm eingegeben werden.

+0

Ich weiß, sowohl utf-8 und utf-16 repräsentieren Unicode, aber sie repräsentieren es anders, oder? Wird es also nicht immer einen Verlust der Repräsentation eines Wortes geben, wenn man zwischen ihnen umwandelt? – stevebot

+0

Nein, es besteht kein Verlustpotenzial. UTF-8 versucht, UTF-32 mit Speicherblöcken von 8 Bit darzustellen. Grundsätzlich, wenn es nicht alles innerhalb der 8 Bits darstellen kann (abzüglich eines gewissen Overheads), dann beginnt es, weitere 8-Bit-Blöcke hinzuzufügen, um die zusätzlichen Informationen zu verarbeiten. Es ähnelt dem Trimmen führender Nullen für eine Zahl. UTF-16 macht grundsätzlich dasselbe, aber die Regeln zum Hinzufügen von zusätzlichem Speicher sind weniger kompliziert und da es mit mehr Bits beginnt, muss es ein Zeichen in mehreren Blöcken weniger oft speichern. UTF-32 verwendet 32 ​​Bit und es schneidet nichts und benötigt keine Erweiterung. –

Verwandte Themen