web-dev-qa-db-fra.com

Supprimer le caractère non-ASCII de la chaîne

var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";

et j'ai besoin de supprimer tous les caractères non-ASCII de la chaîne,

signifie que str ne contient que "INFO] (Higashikurume)";

67
Dev

ASCII est compris entre 0 et 127, donc:

str.replace(/[^\x00-\x7F]/g, "");
190
Zaffy

Cela peut également être fait avec une affirmation positive de suppression, comme ceci:

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

Cela utilise unicode. En Javascript, lors de l’expression unicode pour une expression régulière, les caractères sont spécifiés avec la séquence d'échappement \u{xxxx} mais aussi le drapeau 'u' doit présenter; notez que la regex a des drapeaux 'gu'.

J'ai appelé cela une "affirmation positive d'élimination" en ce sens qu'une assertion "positive" indique quels caractères supprimer, alors qu'une assertion "négative" indique quelles lettres ne pas supprimer. Dans de nombreux contextes, l’affirmation négative, comme indiqué dans les réponses précédentes, pourrait être plus suggestive pour le lecteur. Le circonflexe "^ "dit" pas "et la plage \x00-\x7F dit "ascii", de sorte que les deux ensemble disent "pas ascii".

textContent = textContent.replace(/[^\x00-\x7F]/g,"");

C'est une excellente solution pour les anglophones qui ne se soucient que de l'anglais, et c'est également une excellente réponse à la question initiale. Mais dans un contexte plus général, on ne peut pas toujours accepter le parti pris culturel consistant à supposer que "tout non-ascii est mauvais". Dans les contextes où non ascii est utilisé, mais doit parfois être supprimé, l'affirmation positive d'Unicode convient mieux.

Une bonne indication que des caractères de largeur zéro non imprimables sont incorporés dans une chaîne est lorsque la propriété "length" de la chaîne est positive (différente de zéro), mais ressemble à (c'est-à-dire affiche sous forme de) une chaîne vide. Par exemple, je l'avais dans le Chrome débogueur, pour une variable nommée "textContent":

> textContent
""
> textContent.length
7

Cela m'a incité à vouloir voir ce qui était dans cette chaîne.

> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"

Cette séquence d'octets semble appartenir à la famille de caractères Unicode qui sont insérés par les processeurs Word dans les documents, puis se retrouvent dans les champs de données. Le plus souvent, ces symboles apparaissent à la fin d'un document. Le zéro-largeur-espace "%E2%80%8B" peut être inséré par CK-Editor (CKEditor).

encodeURI()  UTF-8     Unicode  html     Meaning
-----------  --------  -------  -------  -------------------
"%E2%80%8B"  EC 80 8B  U 200B   ​  zero-width-space
"%E2%80%8E"  EC 80 8E  U 200E   ‎  left-to-right-mark
"%E2%80%8F"  EC 80 8F  U 200F   ‏  right-to-left-mark

Quelques références sur celles-ci:

http://www.fileformat.info/info/unicode/char/200B/index.htm

https://en.wikipedia.org/wiki/Left-to-right_mark

Notez que bien que l'encodage du caractère incorporé soit UTF-8, l'encodage dans l'expression régulière ne l'est pas. Bien que le caractère soit incorporé dans la chaîne sous forme de trois octets (dans mon cas) de UTF-8, les instructions de l'expression régulière doivent utiliser le format Unicode à deux octets. En fait, UTF-8 peut contenir jusqu'à quatre octets de long. il est moins compact qu'un format Unicode car il utilise le bit haut (ou le bit le plus fort) pour échapper au codage ascii standard. C'est expliqué ici:

https://en.wikipedia.org/wiki/UTF-8

18
IAM_AL_X

Vous pouvez utiliser les expressions rationnelles suivantes pour remplacer les caractères non-ASCII

str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

Notez cependant que les espaces, les deux points et les virgules sont tous des fichiers ASCII valides. Le résultat

> str
"INFO] :, , ,  (Higashikurume)"
13
Chris Taylor

Pour utiliser ASCII avec des accents:

var str = str.replace(/[^\x00-\xFF]/g, "");
3
Eolia

Aucune de ces réponses ne gère correctement les onglets, les nouvelles lignes, les retours à la ligne et certaines ne gèrent pas les caractères étendus ASCII et unicode. Ceci gardera les onglets et les nouvelles lignes, mais supprimera les caractères de contrôle = ASCII set. Cliquez sur le bouton "Exécuter cet extrait de code" pour le tester. Un nouveau code javascript est en train d'arriver dans le tuyau, il faudra donc peut-être faire \u{FFFFF} mais pas encore

console.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))
3
Jonathan

Une recherche rapide sur Google renvoie cet article sur StackOverflow:

limite les caractères non-ASCII de la chaîne renvoyée par le nœud crypto de nodejs

Je ne prendrai pas le crédit pour la réponse, cependant, vous pouvez remplacer les caractères non-ascii en utilisant cette regex:

str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '') ;
1
aaroncatlin