webentwicklung-frage-antwort-db.com.de

Wie prüfe ich den Zeichensatz von String in Java?

In meiner Anwendung erhalte ich die Benutzerinformationen von LDAP und manchmal kommt der vollständige Benutzername in einem falschen Zeichensatz. Zum Beispiel: 

ТеÑÑ61 ТеÑÑовиÑ61

Es kann auch in Englisch oder Russisch sein und korrekt angezeigt werden. Wenn sich der Benutzername ändert, wird er in der Datenbank aktualisiert. Selbst wenn ich den Wert in der DB ändere, wird das Problem nicht gelöst. 

Ich kann das Problem vor dem Speichern beheben 

new String(incorrect.getBytes("ISO-8859-1"), "UTF-8");

Wenn ich es jedoch für die Zeichenfolge einschließlich der Zeichen in Russisch verwenden werde (z. B. "Тест61 Тестович61"), bekomme ich so etwas wie "???? 61 ???????? 61".

Können Sie bitte etwas vorschlagen, das den Zeichensatz der Zeichenfolge bestimmen kann?

21

Strings in Java, AFAIK, behalten ihre ursprüngliche Codierung nicht bei - sie werden immer intern in einer Unicode-Form gespeichert. Sie möchten den Zeichensatz des ursprünglichen Streams/der Bytes ermitteln. Anruf ist zu spät.

Idealerweise können Sie den Eingabestrom, den Sie lesen, so abrufen: http://code.google.com/p/juniversalchardet/

Es gibt auch viele andere Charset-Detektoren

12
radai

Ich empfehle Apache.tika CharsetDetector , sehr freundlich und stark.

CharsetDetector detector = new CharsetDetector();
detector.setText(yourStr.getBytes());
detector.detect();  // <- return the result, you can check by .getName() method

Außerdem können Sie jeden codierten String in den gewünschten String konvertieren. Nehmen Sie dazu utf-8 als Beispiel:

detector.getString(yourStr.getBytes(), "utf-8");
2
Zanecat

Ihre LDAP-Datenbank ist falsch eingerichtet. Die Anwendung, in die Daten eingefügt werden, sollte in eine bekannte Zeichensatzkodierung konvertiert werden, in Ihrem Fall wahrscheinlich UTF_16. Wählen Sie einen Standard aus. Alle Methoden zum Erkennen der Kodierung sind Vermutungen. 

Die Anwendung, die den Wert schreibt, ist die einzige, die definitiv weiß, welche Codierung sie verwendet, und kann sie ordnungsgemäß in eine andere Codierung wie UTF_16 konvertieren.

1
Evan Langlois

Ich hatte das gleiche Problem. Tika ist zu groß und juniversalchardet erkennt ISO-8859-1 nicht. Also habe ich es selbst gemacht und arbeitet jetzt gut in der Produktion:

public String convert(String value, String fromEncoding, String toEncoding) {
  return new String(value.getBytes(fromEncoding), toEncoding);
}

public String charset(String value, String charsets[]) {
  String probe = StandardCharsets.UTF_8.name();
  for(String c : charsets) {
    Charset charset = Charset.forName(c);
    if(charset != null) {
      if(value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) {
        return c;
      }
    }
  }
  return StandardCharsets.UTF_8.name();
}

Vollständige Beschreibung hier: Erkennung des Zeichensatzes in Java-Strings .

In Ihrer Webanwendung können Sie einen Codierungsfilter deklarieren, der sicherstellt, dass Sie Daten in der richtigen Codierung erhalten.

<filter>
    <description>Explicitly set the encoding of the page to UTF-8</description>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

Ein von der Feder bereitgestellter Filter stellt sicher, dass die Controller/Servlets Parameter in UTF-8 empfangen.

0
sangupta