2012-03-30 9 views
1

Vor einem halben Jahr war ich mit nervigem Problem konfrontiert. Und konnte es immer noch nicht beheben. Problem liegt in log4j-Protokollierung, wo Standard-Zeichensatz ist utf 8.Wie erkennt man Zeichensatz in Java?

Manchmal erhalte ich Nachrichten mit unterschiedlicher Codierung, CP1252. (Es gibt keine Möglichkeit, dies zu ändern). So macht das Einloggen von utf8 den Text unlesbar. Ich kann die Codierung irgendwie beheben, und dieser Text wäre im Protokoll lesbar.

Aber wenn ich diese "Codierung beheben" auf die normale Nachricht anwenden wird, wird es versaut. Ich muss wissen, ob diese Konvertierung wirklich benötigt wird. Leider habe ich keine Ideen.

+4

Es ist nicht möglich, die Kodierung eines Textblocks zuverlässig * zu erkennen *. Du musst generell wissen, womit du es zu tun hast. Vermutlich können Sie den Fall feststellen, in dem Sie in CP1252 Nachrichten empfangen, nein? Was ist das größere Szenario hier? – deceze

+0

Nein. Ich kann es nicht vorhersagen :( Soweit ich mich erinnere, ist normale Nachrichten utf 8 und cp1251. Aber einige von ihnen hängen wahrscheinlich von Windows-Sprache ab, deshalb sind sie in CP1252. Ich kann sie durch Umwandlung 1252 lesbar machen -> 1251-> utf8 Aber es wird sicherlich die normalen versauen .. – VirtualVoid

Antwort

3

Wie deceze kommentierte gibt es keine zuverlässige Möglichkeit, die Codierung eines Textes automatisch zu erkennen.

Die meisten Codierungen versuchen, 1 Byte für Zeichen zu verwenden, da die gleiche Sequenz von Bytes eine völlig andere Zeichenfolge in verschiedenen Codierungen bedeutet. Das einzige, was Sie zuverlässig tun können, ist zu sagen, dass "es keine gültige UTF8-Zeichenfolge ist", andere häufig verwendete Kodierungen haben nicht einmal strenge Regeln, welche Bytefolgen dafür nicht gültig sind.

Am besten kennen Sie die Codierung der Nachricht. Die nächste Option wäre, den Text als Byte-Array neben "utf8 string" zu speichern.

Wenn Sie sehr wenige Kodierungen akzeptieren (utf8/utf16/cp1252), können Sie versuchen, einige Heuristiken zu verwenden - dh die meisten englischen Zeichenfolgen in UTF16 haben 0 wie jedes andere Byte, und Sie können es versuchen um zu sehen, ob die Zeichenfolge als UTF8 OK ist - wenn nicht - dann ist es wahrscheinlich die verbleibende Kodierung.

+0

Scheint, es ist keine schlechte Idee über utf 8 Zeichenfolge für die Gültigkeit zu überprüfen .. Was ist der richtige Weg, dies zu tun? – VirtualVoid

+0

Wenn es bereits "String" wenn Es kommt zu Ihrem Code wahrscheinlich zu spät, aber wenn es Byte-Array-Konvertierung in String mit Ut8-Codierung ist, sollte auch die Prüfung (ich weiß nicht, wie es in Java zu tun, nur angenommen, es ist ähnlich C#) http://stackoverflow.com/questions/1677497/guessing-the-encoding-of-text-represented-as-byte-in-java, enthält detaillierte Schritte und einige Bibliothek Referenzen. –

+0

Hier ist eine Technik, um die Byte-Reihenfolge-Markierung in einer Datei zu verwenden, um seine Kodierung zu bestimmen (funktioniert nicht garantiert, wenn die BOM in einer nicht-cp1252 kodierten Datei fehlt) http://stackoverflow.com/questions/1835430/byte-order-mark -Schreiber-hoch-Datei-lesen-in-Java. Andernfalls verwenden Sie ICU4J –

1

Apache Tika enthält einen Open-Source-Codierungsdetektor.

Es gibt auch kommerzielle Alternativen.

+0

Ich denke, dass Sie ziemlich verzweifelt sein müssen, um einen teuren (NLP-basierten) Kodierungsdetektor an die Logger einer Messaging-Anwendung anzuschließen. –