JavaScript problème de validation avec des caractères internationaux
Nous utilisons l'excellent validateur plugin pour jQuery ici sur un Débordement de Pile pour faire la validation côté client de l'entrée avant de l'envoyer au serveur.
Il fonctionne bien en général, cependant, celui-ci nous a gratter la tête.
La suite du programme de validation de la méthode est utilisée sur le ask/formulaire de réponse pour le champ nom d'utilisateur (notez que vous devez être déconnecté de voir ce champ sur le site en direct, c'est sur tous les /question
page et la /ask
page)
$.validator.addMethod("validUserName",
function(value, element) {
return this.optional(element) ||
/^[\w\-\s\dÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]+$/.test(value); },
"Can only contain A-Z, 0-9, spaces, and hyphens.");
Maintenant cette expression un peu bizarre, mais c'est assez simple:
- correspondent au début de la chaîne (^)
- correspondant à l'un de ces..
- caractère de mot (\w)
- tiret (-)
- de l'espace (\s)
- chiffres (\d)
- fou lune caractères de la langue (àèìòù etc)
- maintenant correspondre à la fin de la chaîne ($)
Oui, nous avons couru dans la Internationalisés Expressions Régulières problème. JavaScript définition de "caractère de mot" ne comprend pas les caractères internationaux.. à tous.
Voici l'étrange partie: même si nous avons donné la peine d'ajouter manuellement des tonnes de validité de la carte des caractères internationaux pour les regex, il ne fonctionne pas. Vous ne pouvez pas entrer ces caractères internationaux dans la zone de saisie pour le nom d'utilisateur sans avoir de l'..
Ne peut contenir que A-Z, 0-9, des espaces et des tirets
.. la validation de retour!
Évidemment la validation est de travail pour les autres parties de la regex.. donc.. ce qui donne?
L'autre partie étrange, c'est que cette validation fonctionne dans le navigateur de la console JavaScript, mais pas lorsqu'il est exécuté en tant que partie de notre standard *.js comprend.
/^[\w-\sÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûãñõãñõäëïöüäëïöüççßøøååææþþðð]+$/
.test('ÓBill de hÓra') === true
Nous sommes vraiment bizarre caractère international des enjeux dans le code JavaScript avant, ce qui entraîne dans certains très, très méchant hacks. Nous aimerions comprendre ce qui se passe ici et pourquoi. Merci de nous éclairer!
- Cela pourrait-il être un problème d'encodage des caractères? I. e., un fou de la lune "Ä" venant de l'utilisateur n'est pas un "Ä" dans votre regex?
- Je ne sais pas la réponse, mais c'est une bonne façon de rédiger une question.
- Jeff toujours défenseurs de la poser bien des questions écrites, donc il vaut mieux le faire que lui-même, aussi 🙂 Mais vous avez certainement raison.
- é n'est pas un personnage à partir d'une lune de langue, pokémon est dans l'alphabet anglais est-il pas? Vérifiez également mon commentaire Jorn répondre
Vous devez vous connecter pour publier un commentaire.
Je pense que l'e-mail et url de méthodes de validation sont une bonne référence, ici, par exemple. la méthode d'email:
Le script pour compiler que les regex.
En d'autres termes, le remplacement de vos arbitraire de la liste des "fous de la lune" des personnages avec ce qui pourrait aider:
En gros, cela évite les problèmes d'encodage de caractères que vous avez d'ailleurs en remplaçant les besoins de codage des caractères plus généraux définitions. Tout n'est pas nécessairement plus lisible, jusqu'à présent, c'est plus courte de votre liste complète.
^[a-zA-Z0-9!@#$%^~&*/?:'
\,\\|{}()-_+\s\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*$`Ce n'est pas vraiment une réponse mais je n'ai pas 50 rep encore à ajouter un commentaire... Il peut certainement être attribuée à des problèmes de codage.
Oui "ECMA ne se soucient pas de l'encodage..." bla bla, eh bien, si vous êtes sur firefox, allez à la View > Encodage des Caractères > Occidentale (ISO-8859-1) puis essayez d'utiliser le Nom de domaine.
Il fonctionne très bien pour moi après la modification de l'encodage manuel (accordé le reste de la page n'aime pas le codage switch, :P)
(sur IE8, vous pouvez aller à Page > Encodage > l'europe Occidentale (Windows) pour obtenir le même effet)
Qu'est-ce que le codage de caractères du fichier JS?
Pour XML des qnames-je utiliser cette RegExp:
Il fonctionne comme un charme aussi avec l'internationalisation des personnages. Note échapper. En raison de que je suis en mesure de limiter le fichier JS à ASCII seulement des caractères. Donc je n'ai pas d'ennuis lorsqu'ils traitent avec de l'ISO-8859 vs UTF-8 caractères.
Ce n'est pas plus vrai, si vous utilisez des codages de caractères où l'ASCII est pas de véritable sous-ensemble (comme, par exemple, en Asie de l'UTF-16).
Acclamations,
\u0100
encore ne contient pas de<
. Étrange, en effet.caractères internationaux répertoriés font partie de l'ASCII étendu. ceux ajoutés par vous ne sont certainement pas.
Voir aussi la déclaration de travaux dans la console, cela pourrait-il avoir à faire le chemin de votre .js fichiers sont enregistrés (c'est à dire ascii ou UTF-8) et que le navigateur est en cours de chargement entre eux de la même manière et dans le processus, se traduit par les personnages?
Utiliser quelque chose comme Fiddler ou Charles (pas Firebug Net du panneau, ou n'importe quoi d'autre qui est fait à l'intérieur du navigateur) pour analyser ce qu'il fait venir au-dessus du fil. C'est presque certainement d'un problème de codage: soit le fichier a été sauvegardé dans certains Microsoft jeu de caractères et est envoyé en tant que UTF-8, ou peut-être dans l'autre sens.
Dans le cas de JS les expressions régulières, vous pouvez, comme Boldewyn souligne, d'éviter ces problèmes en spécifiant le point de code Unicode pour les caractères que vous voulez qui sont en dehors de la plage US-ASCII. Il serait toujours ainsi à assurez-vous de ne pas mélanger les codages entre l'endroit où est enregistré le fichier et l'endroit où il est servi, si.
Tard pour le jeu ici, mais j'ai juste utilisé cette expression et il semble bien fonctionner pour moi. Semble assez complet et relativement simple:
JS: