web-dev-qa-db-fra.com

Comment vérifier le jeu de caractères de chaîne en Java?

Dans mon application, je reçois les informations utilisateur de LDAP et parfois le nom d'utilisateur complet se présente sous un mauvais jeu de caractères. Par exemple: 

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

Il peut également être en anglais ou en russe et affiché correctement. Si le nom d'utilisateur change, il est mis à jour dans la base de données. Même si je change la valeur dans la base de données, cela ne résoudra pas le problème. 

Je peux le réparer avant de sauvegarder en faisant cela 

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

Cependant, si je l'utilise pour la chaîne comprenant des caractères en russe (par exemple, "Тест61 Тестович61"), j'obtiens un résultat du type "???? 61 ???????? 61".

Pouvez-vous suggérer quelque chose qui puisse déterminer le jeu de caractères d'une chaîne?

21
Adilya Taimussova

Les chaînes en Java, autant que je sache, ne conservent pas leur codage d'origine - elles sont toujours stockées en interne sous une forme Unicode .. Vous voulez détecter le jeu de caractères du flux/octets d'origine - c'est pourquoi je pense que votre String.toBytes L'appel est trop tard.

Idéalement, si vous pouviez obtenir le flux d'entrée que vous lisez, vous pouvez l'exécuter comme suit: http://code.google.com/p/juniversalchardet/

Il y a aussi beaucoup d'autres détecteurs de jeux de caractères

12
radai

Je recommande Apache.tika CharsetDetector , très sympathique et fort.

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

De plus, vous pouvez convertir n’importe quelle chaîne encodée en votre choix, prenez comme exemple utf-8

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

Votre base de données LDAP n'est pas configurée correctement. L'application qui y insère les données doit être convertie en un codage de jeu de caractères connu, probablement UTF_16 dans votre cas. Choisissez une norme. Toutes les méthodes de détection du codage sont des suppositions. 

L'application qui écrit la valeur est la seule à savoir de manière définitive le codage qu'elle utilise et à convertir correctement vers un autre codage tel que UTF_16.

1
Evan Langlois

J'ai eu le même problème. Tika est trop grand et Juniversalchardet ne détecte pas ISO-8859-1. Donc, je me suis fait et maintenant fonctionne bien dans la production:

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();
}

Description complète ici: Détecter le jeu de caractères en chaînes Java .

1

Dans votre application Web, vous pouvez déclarer un filtre de codage garantissant que vous recevez les données dans le bon codage.

<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>

Un filtre fourni par ressort assure que les contrôleurs/servlets reçoivent les paramètres en UTF-8.

0
sangupta