web-dev-qa-db-fra.com

Conversion des caractères spéciaux tels que ü et à en leurs équivalents originaux en alphabet latin en C #

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.

É -> É
“ -> "
†-> "
Ç -> Ç
à -> Ã
é, 'é
à -> ú -> ú
• -> -
Ø -> Ø
õ -> õ
í -> í
â -> â
ã -> ã
ê -> ê
á -> á
é -> é
ó -> ó
– -> –
ç -> ç
ª -> ª
º -> º
à  -> à
14
Gareth Harding

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.

21
Guffa

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

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

4
el vis

Ici vous pouvez trouver une liste complète:

http://bueltge.de/wp-content/download/wk/utf-8_kodierungen.pdf

1
Jorden van Foreest

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

0
Alhan Ozdemir