6 votes

Bibliothèque Java permettant de corriger les textes mal codés à l'aide d'une heuristique

J'ai affaire à un service web externe qui me donne des chaînes de caractères incorrectement codées (et/ou corrompues) ( UTF-8 ) qui étaient très probablement soit ISO LATIN o WINDOWS-1252 mais sont maintenant UTF-8 (et ou un mélange de ISO/Windows/UTF-8). Chapeaux A Lovely ( Â ) abondent.

Je ne peux évidemment pas réparer la façon dont le service web externe stocke ses chaînes de caractères, et l'information est donc perdue. Ainsi, je sais que les espoirs d'une traduction à 100% ne sont pas possibles.

Mais j'espérais que quelqu'un avait écrit une bibliothèque heuristique de mappage de caractères en Java (il est peu probable que quelqu'un tape les chapeaux A).

Sinon, je pense que je peux porter le code PHP de ce type : https://stackoverflow.com/a/3521340/318174

UPDATE et explication : Une simple conversion comme celle à laquelle @VGR a répondu ne fonctionnera pas. Je n'ai pas les octets d'origine. Les données ont été converties de manière incorrecte au niveau du point de terminaison (serveur SOAP peut-être ). getBytes(/*with out correct encoding*/) a été fait ou peut-être que les données sont stockées dans un format incorrect). Lorsque vous convertissez des octets en chaînes de caractères en Java, les données ne sont pas conservées, sauf si l'encodage est le même partout. C'est facile à comprendre si vous pensez à quelque chose comme ASCII <-> UTF-8 . Avec Windows-1252 o ISO Latin c'est beaucoup plus compliqué car les données ne sont pas perdues mais souvent confondues. C'est parce que ces encodages peuvent être de deux octets et ne sont pas un sous-ensemble de UTF-8 .

Si vous ne me croyez pas, vous pouvez essayer de faire getBytes() dans les deux sens avec des encodages différents et il y aura une corruption et une perte de données.

0voto

VGR Points 4236

Je ne comprends peut-être pas la nature des données incorrectement encodées, mais ce code PHP me semble excessif. Si vous avez des octets UTF-8 qui ont été passés comme des caractères individuels, vous devriez pouvoir le faire :

String fix(String s) {
    byte[] bytes = s.getBytes(Charset.forName("windows-1252"));
    return new String(bytes, StandardCharsets.UTF_8);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X