Javascript chaîne de comparaison échoue lorsque l'on compare les caractères unicode
Je veux comparer deux chaînes de caractères en JavaScript qui sont les mêmes, et pourtant, l'opérateur d'égalité ==
renvoie la valeur false. Une chaîne de caractères contient un caractère spécial (par exemple. le danois å
).
Code JavaScript:
var filenameFromJS = "Designhåndbog.pdf";
var filenameFromServer = "Designhåndbog.pdf";
print(filenameFromJS == filenameFromServer); //This prints false why?
La solution
Ce qui a fonctionné pour moi est de normalisation unicode comme slevithan souligné.
Je bifurquais mon original jsfiddle pour faire une version à l'aide de la normalisation lib suggéré par slevithan. Lien: http://jsfiddle.net/GWZ8j/1/.
Voir cet article sur
Lorsque les deux opérandes sont de même type, il n'a pas d'importance si vous utilisez lâche ou comparaison stricte.
C'est aussi très utile: joelonsoftware.com/2003/10/08/... (Ce que chaque développeur doit savoir sur unicode et les jeux de caractères)
==
vs ===
stackoverflow.com/questions/359494/...Lorsque les deux opérandes sont de même type, il n'a pas d'importance si vous utilisez lâche ou comparaison stricte.
C'est aussi très utile: joelonsoftware.com/2003/10/08/... (Ce que chaque développeur doit savoir sur unicode et les jeux de caractères)
OriginalL'auteur tougher | 2012-05-29
Vous devez vous connecter pour publier un commentaire.
Contrairement à ce que certains d'autres personnes ici l'ont dit, cela n'a rien à voir avec les encodages. Plutôt, vos deux chaînes utilisent différents points de code pour rendre le visuel des personnages.
Pour résoudre ce problème, vous devez effectuer la normalisation Unicode sur les deux chaînes de caractères avant de les comparer. Unforunately, JavaScript ne dispose pas de cette fonctionnalité intégrée. Ici est une bibliothèque JavaScript qui peut effectuer la normalisation pour vous: https://github.com/walling/unorm
Vous avez raison, j'ai manqué que
CC 8A
est l'UTF-8 séquence de code pourU+30A COMBINING RING ABOVE
, qui est précédée para
. L'autre chaîne aC3 A5
qui code pourU+00E5 LATIN SMALL LETTER A WITH RING ABOVE
en UTF-8. IIRC, Mac OS préfère la combinaison de caractères, tandis que d'autres Systèmes d'exploitation préfèrent la seule forme de glyphe. Il devrait être possible d'avoir le serveur de convertir un, bien que, donc, il n'y a pas de grande bibliothèque côté client nécessaire.PointedEars, ce n'est pas forcément possible ou idéal. E. g., vous ne pourriez pas vouloir faire un serveur aller-retour juste pour effectuer une comparaison de chaîne, ou vous pourriez être à l'aide de JavaScript sur le serveur. @Plus sévères ,Il est proposé d'ajouter la normalisation Unicode pour les futures versions de JavaScript. Voir strawman:unicode_normalization.
OriginalL'auteur slevithan
Le JavaScript opérateur d'égalité
==
apparaît pas dans les circonstances suivantes. Dans tous les cas, il est programmeur d'erreur. Pas un bug dans le code JavaScript.Les deux chaînes ne contiennent pas le même nombre et la séquence de caractères.
Il y a des espaces ou des retours à la ligne avant, à l'intérieur, ou après une chaîne de caractères. Utiliser un trim() de l'opérateur sur les deux et de regarder de près les deux chaînes.
Surprise typecasting. Le programmeur est de comparer les types de données qui sont incompatibles.
Il y a des caractères unicode qui ressemblent à d'autres caractères unicode, mais, en fait, sont différents des caractères unicode.
dans ce cas, le numéro 4 est le coupable
Différents normalisation unicode n'est pas sur les différents personnages, mais des moyens différents de point de code unicode séquences ont été utilisés pour désigner le même personnage.
OriginalL'auteur Eric Leschinski
UTF-8 est une chose complexe. Le jeu de caractères a deux codes différents pour des caractères tels que á, é, etc. Comme vous l'avez déjà voir dans l'URL de la version encodée, l'HEX d'octets, dont le personnage est diffèrent pour les deux versions.
Voir cette réponse pour plus d'informations.
Fixe.
Maintenant, vous dites que l'UTF-8 est un jeu de caractères. Il n'est pas. Je suis aussi assez certain que votre prémisse est fausse: UTF-8 du code de la séquence ne peut pas commencer par 0xCC.
Vous avez raison, j'aurais appelé ça "encodage", comme il apparaît (w3.org/TR/html4/charset.html). Le code HTML est
<meta charset=UTF-8>
(HTML5) ou<meta http-equiv=Content-Type content='text/html; charset=UTF-8'>
cependant, de sorte que c'est quelque peu trompeur.Oui, je suppose que nous aurons à vivre avec cette erreur dès le début des projets Internet (je parle de la RFC 822 et amis ici) pour une longue période à venir.
OriginalL'auteur user2428118
J'ai eu ce même problème.
Ajoutant
pour le fichier HTML résolu le problème.
Dans mon cas, le moteur de template a été la cuisson d'une chaîne json dans le fichier HTML. Cette chaîne a été en unicode.
Bien que le modèle a été également un fichier unicode, la JS moteur a été le traitement de la chaîne que j'ai écrit dans le modèle en tant que latin-1 chaîne codée, jusqu'à ce que j'ai ajouté la balise meta.
J'étais en comparant les tapé dans la corde à l'un des objets JSON éléments (
location.title == "Mühle"
)OriginalL'auteur Daniel F