8
votes

Des chaînes apparemment identiques échouent en comparaison

Je rencontre un problème étrange en comparant deux chaînes. Voici mon code: xxx

dans la console, j'ai: xxx

Je suppose que mes chaînes contiennent des caractères étranges, alors comment devrais-je Comparez-les? J'ai lu La comparaison de chaînes JavaScript échoue lors de la comparaison des caractères Unicode mais dans mon cas, x < / code> et y proviennent de la même source et ont le même encodage.


7 commentaires

Pourquoi référence-tu y.replace au lieu de y ?


Oops désolé. En fait, c'est une question de copie / pâte. Au début, je comparais comparer x.replace (/ \ n / g, '') et y.replace (/ \ n / g, '') pour mes tests . Je le corrige dans le poteau.


S'il vous plaît démontrer la question du code de travail.


Qu'est-ce que X.L Longueur et Y.Length disent?


Console d'outils de développeur chrome: '1ä4 ±' == '1ä4 ±' true , '1ä4 ±' === '1ä4 ±' true , afin que les valeurs sont identiques


@ Ken-abdiassoftwareware: x.length donne 6 et Y.Length donne 7. @akonsu: j'ai édité mon message, voici comment il fonctionne actuellement.


Utiliser === et que se passe-t-il alors


4 Réponses :


6
votes

Le Ä dans vos chaînes peut être représenté sous forme de caractère unicode unique ( lettre majuscule latine A avec diagèse, U + 00c4 ), ou comme un caractère composite consistant en lettre majuscule latine A (U + 0041) suivi d'un Combinaison de la diagèse (U + 0308) < / a> diacritique.

Il peut également y avoir un certain nombre de Espaces de largeur zéro (U + 200b) , ainsi que d'autres caractères "invisibles" de vos chaînes.

Par conséquent, les deux chaînes peuvent rendre la même chose, mais en réalité être différente.


6 commentaires

Exactement, ne comparez pas les chaînes en les imprimant.


Vous devez avoir raison. Dans les commentaires de mon post initial, lors de la comparaison des longueurs des chaînes, il y a une différence.


Effectivement x est généré et stocké par une bibliothèque openpgp et y < / code> est pris chrome.storage.local . Peut-être que lorsque je stocke cette chaîne avec l'API chrome, je change la chaîne ... @ivankuckir: Que suggérez-vous? Effectuez la normalisation unicode comme dans Ce sujet


@emma, j'imagine que les cordes stockées dans le stockage local proviennent de cette bibliothèque OpenPGP pour commencer. Si tel est le cas, pouvez-vous effectuer un simple vérification aller-retour pour vérifier que Chrome ne normalise pas les chaînes lors de leur persistance de stockage local?


@ Frédéricamidi, comment puis-je faire ça? Comparaison Escape (strfrompgplib) et Escape (Strfromchromestorage) est ok?


@emma, Escape () fera probablement le travail car il ne sait pas sur les combinaisons et les substituts de l'Unicode. Cela peut être correct, en fonction de votre curiosité et de vos besoins exacts. Par un essai aller-retour, je pensais à quelque chose comme: récupérez la chaîne problématique de la bibliothèque OpenPGP, une chaîne de persistance au stockage local, lecture de la chaîne de stockage local, comparer les chaînes. S'ils sont différents, le stockage local chrome aligne des valeurs quelque part sur le chemin, et je ne pense pas que cela soit censé faire cela.



1
votes

BTW. Essayez ce code dans JS (Copy-Coller) :)

console.log("A" == "А");


4 commentaires

Lorsque je le copier dans la console, il affiche FALSE, mais si je le tape manuellement. ça montre vrai ....


@ RAM2013, avez-vous lu ma réponse? Si vous vous demandez toujours pourquoi cela se produit après, je dois probablement le raffiner.


: O I Je pensais d'abord que tu plaisantais de moi ... et j'ai essayé. Cela signifie que je devrais toujours utiliser localecompare () à la place?


Oh, je n'ai pas réalisé que cela a été réalisé que cela était lié à la réponse de FrédérichaMidi. Donc, merci@ivankuckir pour cet exemple. ;)



4
votes

Essayez d'échapper à vos deux cordes pour voir quels caractères sont en eux. Dans ce cas (bien que FRÉDÉRIC ait couvert les cas possibles) puisque vous utilisez PGP, vous avez probablement un cadeau de caractères non imprimable binaire non imprimable.

escape(x);
escape(y);


4 commentaires

En effet Escape () renvoie "% c4a% u0308" pour "ÄÄ" (premier caractère unique, second composite unique). Cela permet de comparer facilement sans recourir à la normalisation.


Je ne comprends pas clairement ce qu'est l'évasion. évasion (x) donne "/% 28% 3f% 3a% 5e% 7c% 3A% 7c% 2c% 29% 28% 3F% 3A% 5CS *% 5C% 5B% 29 + / g" et évasion (Y) "/% 5C% 5C% 28% 3A% 3A% 5B% 22% 5C% 5C 5C 5C / BFNRT% 5D% 7CU% 5B% 5CDA-FA-F% 5 D% 7B4% 7D% 29 / g", S'il n'y a pas d'erreur ... C'est la première fois que j'utilise des points d'arrêt, et tout ce genre de choses.


@emmasculintur Escape "codes" caractères non imprimables, mais aussi des espaces. Son objectif principal est de rendre la chaîne transférable sur le réseau comme une chaîne. Mais il peut être utilisé pour détecter des caractères que vous ne voyez peut-être pas s'il vient d'être imprimé sur la console, etc.


Euh, je voulais dire content transféré sous forme de chaîne .. La privation de sommeil frappe :-). Vous n'avez pas besoin de vous échapper pour comparer comme vous l'avez vu simplement comparer x === y retourne false, mais c'est un outil agréable pour savoir qui chargez-vous dans la chaîne qui ne peut pas être imprimée / vue .



0
votes

Si vous essayez de le faire en C #, cela pourrait avoir à faire quelque chose avec la normalisation. Formc vs formd vs formkc vs formkd Référence: http://sharepoint.asia/ deux - exactement-idées-strings-échec-tandis que-comparaison-in-c-net /


1 commentaires

Ce lien peut répondre à la question, mais il est recommandé de copier le contenu principal du lien vers la question pour une référence supplémentaire, car le lien peut devenir inactif.