Une base de données MySQL m'a exporté. Son encodage semble quelque peu confus et contient un mélange de HTML char codes
tel que & uuml;
et d'autres caractères problématiques représentant les mêmes lettres telles que ü
et Ã
. Il est de mon devoir de rétablir une certaine cohérence dans le fichier et de tout insérer dans les caractères latins appropriés, par exemple. ú
et ó
.
Un exemple du type de chaîne que je traite est
Desinfektionslösungstücher für Flä¤chen
Ce qui devrait équivaloir à
50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen
50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen
Existe-t-il une méthode disponible dans C # /. Net 4.5 qui permettrait de ré-encoder avec succès les codes de type ü
et Ã
en UTF-8
?
Sinon quelle approche serait souhaitable?
De plus, le caractère de paragraphe ¶
dans l'exemple ci-dessus est-il un caractère de paragraphe réel ou une partie d'une autre combinaison de caractères?
J'ai créé une table de recherche dans le cas où il est nécessaire de rechercher et de remplacer, ce qui se trouve ci-dessous, mais je ne suis pas sûr de sa complétude.
É -> É
“ -> "
†-> "
Ç -> Ç
à -> Ã
é, 'é
à -> ú -> ú
• -> -
Ø -> Ø
õ -> õ
à -> í
â -> â
ã -> ã
ê -> ê
á -> á
é -> é
ó -> ó
– -> –
ç -> ç
ª -> ª
º -> º
à -> à
Tout d’abord, comme les données ont été décodées à l’aide d’un codage incorrect, il est probable que certains caractères soient impossibles à récupérer. On dirait que ce sont des données UTF-8 qui ont été décodées de manière incorrecte en utilisant un codage à 8 bits.
Il n'y a pas de méthode intégrée pour récupérer des données comme celle-ci, car ce n'est pas quelque chose que vous faites normalement. Il n'y a pas de moyen fiable pour décoder les données, car elles sont déjà cassées.
Ce que vous pouvez essayer, c’est d’encoder les données et de les décoder à l’aide du mauvais encodage, exactement l’inverse:
byte[] data = Encoding.Default.GetBytes(input);
string output = Encoding.UTF8.GetString(data);
Le Encoding.Default
utilise le codage ANSI actuel pour votre système. Vous pouvez essayer différents encodages et voir lequel donne le meilleur résultat.
Les données ne sont que partiellement irrécupérables en raison du codage Windows-1252 comportant 5 emplacements non attribués. Certaines modifications de Windows-1252 les remplissent de caractères de contrôle , Mais elles ne parviennent pas aux publications dans Stackoverflow. Si vous avez modifié Windows-1252 a été utilisé, vous pouvez récupérer complètement tant que vous ne perdez pas Les caractères de contrôle masqués dans les pâtes de copie.
Il y a aussi le caractère d'espace insécable qui est ignoré ou transformé en un espace généralement avec des copypastes, mais ce n'est pas un problème lorsque vous traitez directement avec des octets.
L'abus de codage erroné que cette chaîne a subi est le suivant:
UTF-8 -> Windows-1252 -> UTF-8 -> Windows-1252
Pour récupérer, voici un exemple:
String a = "Desinfektionslösungstücher für Flächen";
Encoding utf8 = Encoding.GetEncoding(65001);
Encoding win1252 = Encoding.GetEncoding(1252);
string result = utf8.GetString(win1252.GetBytes(utf8.GetString(win1252.GetBytes(a))));
Console.WriteLine(result);
//Desinfektionslösungstücher für Flächen
C'est probablement la chaîne encodée par Windows-1252 que vous lisez en UTF-8.
Comme Guffa l'a mentionné, les données ont été corrompues.
Regardons les octets:
ö -> C3B6 en UTF8
dans windows-1252 C3 -> Ã B6 -> ¶
alors ö -> ¶
qu'en est-il de tous ces "ƒÂ":
ƒ -> 83 Â -> C2
Honnêteté, je ne sais pas pourquoi ils apparaissent, mais vous pouvez essayer de les effacer et de procéder à certaines conversions comme l'a mentionné Guffa. Bonne chance
Ici vous pouvez trouver une liste complète:
http://bueltge.de/wp-content/download/wk/utf-8_kodierungen.pdf
J'ai déjà été troublé par ce problème de caractère ... .. Solution.
Mon fichier HTML (cs) était UTF-8; Je me suis converti au format UTF-8Y (UTF-8 avec une nomenclature).