Comment supprimer les caractères UTF-8 invalides d'une chaîne JavaScript?
Je voudrais supprimer toutes les invalides de caractères UTF-8 à partir d'une chaîne de caractères en JavaScript. J'ai essayé avec ce code JavaScript:
strTest = strTest.replace(/([\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})|./g, "$1");
Il semble que l'UTF-8 validation regex décrit ici (lien supprimé) plus complète, et j'ai adapté la même manière, comme:
strTest = strTest.replace(/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})|./g, "$1");
Ces deux morceaux de code semble être en permettant à UTF-8 valide, mais ne sont pas filtrant presque tous les mauvais caractères UTF-8 à partir de mes données de test: UTF-8 décodeur capacité et le stress test. Le mauvais caractères sont inchangés ou semblent avoir certains de leurs octets retiré de la création d'un nouveau caractère non valide.
Je ne suis pas très familier avec la norme UTF-8 ou avec multibyte en JavaScript donc je ne suis pas sûr si je ne suis pas pour représenter correcte UTF-8 dans la regex ou si je suis à l'application de cette regex mal en JavaScript.
Edit: ajout de l'indicateur global pour ma regex par Tomalak commentaire - toutefois, cela ne fonctionne toujours pas pour moi. Je suis l'abandon de le faire sur le côté client par bobince commentaire.
source d'informationauteur Matthew Sielski
Vous devez vous connecter pour publier un commentaire.
Les chaînes de caractères JavaScript natif de l'Unicode. Ils détiennent des séquences de caractères* pas de séquences d'octets, de sorte qu'il est impossible de contenir une défaillance de séquence d'octets.
(Techniquement, elles en contiennent en fait de code UTF-16 unité de séquences, ce qui n'est pas tout à fait la même chose, mais ce n'est probablement pas quelque chose que vous devez à vous soucier de la droite maintenant.)
Vous pouvez, si vous devez pour une raison quelconque, créer une chaîne de caractères contenant les caractères utilisés comme des espaces réservés pour les octets. c'est à dire. en utilisant le caractère
U+0080
('\x80') pour l'octet 0x80. C'est ce que vous obtiendriez si vous avez encodé caractères d'octets en UTF-8, puis décodé en arrière de caractères ISO-8859-1 par erreur. Il y a un spécial JavaScript idiome pour cela:et de ramener de l'UTF-8 pseudobytes de caractères de nouveau:
(Ce qui est, notamment, à peu près le seul moment où le
escape
/unescape
fonctions doivent jamais être utilisés. Leur existence dans un autre programme est presque toujours un bug.)decodeURIComponent(escape(bytes))
car il se comporte comme un UTF-8 décodeur, va déclencher une erreur si la séquence des unités de code de la fed en il ne serait pas acceptable que les octets UTF-8.Il est très rare que vous devez travailler sur les chaînes d'octets comme ça en JavaScript. Mieux de continuer à travailler en mode natif dans Unicode sur le côté client. Le navigateur va prendre soin de l'UTF-8 codage de la chaîne sur le câble (dans la soumission d'un formulaire ou XMLHttpRequest).
J'utilise le présent simple et robuste approche:
Essentiellement tout ce que vous voulez vraiment sont les caractères ASCII de 0 à 127 donc simplement de reconstruire la chaîne de char par char. Si c'est un bon char, gardez - si non, fossé. Assez robuste et si l'assainissement est votre objectif, il est assez rapide (en fait c'est très rapide).
Simple erreur, grands effets:
sans le "global" du pavillon, le remplacement se produit pour le premier match seulement.
Côté remarque: Pour supprimer tous les caractères que ne remplit pas une sorte de condition complexe, comme tomber dans un ensemble de certains caractères Unicode plages, vous pouvez utiliser anticipation négatif:
où
re
se lit commeSi vous tentez de supprimer le "caractère invalide" - � - à partir de chaînes de caractères javascript, alors vous pouvez vous débarrasser d'eux comme ceci:
J'ai rencontré ce problème avec un de vraiment étrange résultat à partir de la Date de la Prise de données d'une image numérique. Mon scénario est certes unique - à l'aide de windows scripting host (wsh) et de la Coquille.Application objet activex qui permet d'obtenir l'espace de noms de l'objet du dossier et de l'appel de la GetDetailsOf fonction essentiellement de retour des données exif après qu'il a été analysé par le système d'exploitation.
Dans windws vista et 7, le résultat ressemble à ceci:
?8/?27/?2011 ??11:45 PM
Donc, mon approche a été comme suit:
Le résultat est bien sûr une chaîne de caractères à l'exclusion de celles des caractères d'interrogation.
Je sais que vous êtes allé avec une autre solution tout à fait, mais je pensais que je poste ma solution au cas où quelqu'un d'autre est d'avoir des problèmes avec cela et ne peut pas utiliser un langage côté serveur approche.