Question

Imaginez que j'ai une chaîne en C #: & "I Don & # 195; & # 162; & # 226; & # 8218; & # 172; & # 226; & # 8222; & # 162; ne te vois pas .. & Quot;

Je veux supprimer (remplacer par rien ou etc.) ces & "; & # 195; & # 162; & # 226; & # 8218; & # 172. ; & # 226; & # 8222; & # 162; & Quot; symboles.

Comment puis-je faire cela?

Était-ce utile?

La solution

Ce "courrier indésirable" ressemble beaucoup à une personne qui a interprété les données UTF-8 comme ISO 8859-1 ou Windows-1252, probablement à plusieurs reprises.

& # 195; & # 162; & # 226; & # 8218; & # 172; & # 226; & # 8222; & # 162 ; est la séquence C3 A2, E2 82 AC, E2 84 A2.

  • UTF-8 C3 A2 = U + 00E2 = & # 226;
  • UTF-8 E2 82 AC = U + 20AC = & # 8364;
  • UTF-8 E2 84 A2 = U + 2122 = & # 8482;

Nous répétons l'opération: sous Windows 1252, cette séquence correspond à E2 80 99. Le caractère aurait donc dû être U + 2019, marque de citation unique droite (& # 8217;)

Vous pouvez effectuer plusieurs passes avec des tableaux d'octets, Encoding.UTF8 et Encoding.GetEncoding (1252) pour rétablir correctement le fichier indésirable dans ce qui avait été entré à l'origine. Vous devrez vérifier votre traitement pour trouver les deux emplacements où les données UTF-8 ont été interprétées de manière incorrecte comme étant Windows-1252.

Autres conseils

"I Don’t see ya..".Replace( "’", string.Empty);

Comment cette ordure est-elle entrée la première place? C'est la vraie question.

En supprimant tout caractère non latin, vous interrompez intentionnellement le support de l'internationalisation.

N'oubliez pas le pauvre gars dont le nom a un " & # 226; " en elle.

Cela semble étrangement familier à un problème de codage de caractères lié au jeu de caractères Windows stocké dans une base de données utilisant le codage de caractères standard. Je vois quelqu'un qui a voté pour Will, mais il a raison. Vous pouvez résoudre le problème immédiat, mais les combinaisons de caractères sont illimitées si tel est le problème.

Si vous devez vraiment faire cela, les expressions régulières sont probablement la meilleure solution.

Je vous recommande vivement de réfléchir aux raisons pour lesquelles vous devez le faire, cependant - au moins certains des caractères que votre fiche est indésirable sont parfaitement valables et utiles dans d'autres langues, et le simple fait de les filtrer va probablement gêner au moins certains de vos utilisateurs internationaux. En tant que suédois, je ne saurais trop insister sur le fait que je déteste des systèmes qui ne peuvent pas gérer nos & # 229 ;, & # 228; et & # 246; caractères correctement.

Pensez à Regex.Replace (your_string, regex, " ")) - c’est ce que j’utilise.

Testez chaque caractère à tour de rôle pour voir s’il s’agit d’un caractère alphabétique ou numérique valide. Sinon, supprimez-le de la chaîne. Le test de personnage est très simple, il suffit d'utiliser ...

char.IsLetterOrDigit;

S'il vous plaît, il y en a plusieurs autres comme ...

char.IsSymbol;
char.IsControl;

Regex.Replace (& "; La chaîne &"; & "; [^ a-zA-Z] &"; & "; &";) ;

C’est ce que vous feriez en C #, bien que cette expression régulière ([^ a-zA-Z]) devrait fonctionner dans la plupart des langues.

[Edité: j'ai oublié l'espace dans la regex]

Le code ASCII / entier pour ces caractères serait en dehors des plages alphabétiques normales. Rechercher et remplacer par des caractères vides. String a une méthode de remplacement, je crois.

Utilisez une liste noire de choses que vous ne voulez pas ou, de préférence, une liste blanche. Avec une liste blanche, vous parcourez la chaîne et ne copiez que les lettres figurant dans votre liste blanche dans la chaîne de résultat. Vous avez dit supprimer, et vous avez deux pointeurs que vous lisez (R) et l’autre que vous écrivez (W):

I Donââ‚
     W  R

si la virgule est dans votre liste blanche, vous devriez alors la lire et l'écrire où & # 195; est ensuite avancer les deux pointeurs. UTF-8 est un codage sur plusieurs octets. Par conséquent, il est possible que le pointeur ne soit pas simplement ajouté à l'adresse.

Avec C, il est facile d’obtenir une liste blanche en utilisant l’une des fonctions prédéfinies (ou macros): isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspunct, isspace, isupper, isxdigit. Dans ce cas, vous envoyez avec une fonction de liste blanche au lieu d'un ensemble bien sûr.

Habituellement, lorsque je vois des données semblables à celles que vous avez, je recherche une corruption de mémoire ou des preuves suggérant que le codage que je prévois est différent de celui avec lequel les données ont été entrées.

/ Allan

J'ai eu le même problème avec les fichiers indésirables jeté par Adobe dans un dump EXIF. J'ai passé une heure à chercher une réponse directe et à essayer de nombreuses suggestions à moitié cuites qui ne fonctionnaient pas ici.

Ce fil, plus que tout ce que j'ai lu, était rempli de questions profondes et approfondies telles que "comment y est-il arrivé?", "et si quelqu'un avait ce personnage en leur nom?", êtes-vous sûr de vouloir briser l'internationalisation ? '

Il y a eu quelques démonstrations impressionnantes d’érudition expliquant comment cette ordure aurait pu arriver ici et expliquant l’évolution des divers schémas de codage de caractères. La personne voulait savoir comment la supprimer, pas comment elle était créée ou quelles étaient les normes en vigueur, aussi intéressante que puisse être cette anecdote.

J'ai écrit un petit programme qui m'a donné la bonne réponse. Au lieu de paraphraser le concept principal, voici le programme complet, autonome (fonctionnant au moins sur mon système) et le résultat avec lequel j'ai utilisé le bric-à-brac:

#!/usr/local/bin/perl -w

# This runs in a dos window and shows the char, integer and hex values
# for the weird chars. Install the HEX values in the REGEXP below until
# the final test line looks normal. 
$str = 's: “Brian';  # Nuke the 3 werid chars in front of Brian.
@str = split(//, $str);
printf("len str '$str' = %d, scalar \@str = %d\n", 
    length $str, scalar @str);
$ii = -1;
foreach $c (@str)  {
   $ii++;
   printf("$ii) char '$c', ord=%03d, hex='%s'\n", 
       ord($c), unpack("H*", $c));
}
# Take the hex characters shown above, plug them into the below regexp
# until the junk disappears!
($s2 = $str) =~ s/[\xE2\x80\x9C]//g;  # << Insert HEX values HERE
print("S2=>$s2<\n");  # Final test

Result:
M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl
len str 's: GÇ£Brian' = 11, scalar @str = 11
0) char 's', ord=115, hex='73'
1) char ':', ord=058, hex='3a'
2) char ' ', ord=032, hex='20'
3) char 'G', ord=226, hex='e2'
4) char 'Ç', ord=128, hex='80'
5) char '£', ord=156, hex='9c'
6) char 'B', ord=066, hex='42'
7) char 'r', ord=114, hex='72'
8) char 'i', ord=105, hex='69'
9) char 'a', ord=097, hex='61'
10) char 'n', ord=110, hex='6e'
S2=>s: Brian<

C'est NORMAL !!!

Une autre suggestion pratique et utilisable que j'ai rencontrée:     iconv -c -t ASCII < 6s-2014.1031-238246.halloween.exf.dif & Gt; exf.ascii.dif

Si la chaîne a la date de n'importe quelle date indésirable, c'est une bonne façon de supprimer ces données indésirables.

     string InputString = "This is grate kingdom¢Ã‚¬â"; 
     string replace = "’";
     string OutputString= Regex.Replace(InputString, replace, "");

     //OutputString having the following result 

Cela fonctionne bien pour moi, merci d'avoir regardé cette critique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top