Je rencontre un problème étrange en comparant deux chaînes. Voici mon code: dans la console, j'ai: p> 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 code> proviennent de la même source et ont le même encodage. p> p>
4 Réponses :
Le 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. P>
Par conséquent, les deux chaînes peuvent rendre la même chose, mais en réalité être différente. P> Ä code> 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. p>
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 code> est généré et stocké par une bibliothèque openpgp et y < / code> est pris chrome.storage.local code>. 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) code> et Escape (Strfromchromestorage) code> est ok?
@emma, Escape () code> 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.
BTW. Essayez ce code dans JS (Copy-Coller) :)
console.log("A" == "Ð");
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 () code> à 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. ;)
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);
En effet Escape () code> renvoie "% c4a% u0308" code> pour "ÄÄ" code> (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 i> 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 i> chargez-vous dans la chaîne qui ne peut pas être imprimée / vue .
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 / p>
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.
Pourquoi référence-tu
y.replace code> au lieu dey code>?Oops désolé. En fait, c'est une question de copie / pâte. Au début, je comparais comparer
x.replace (/ \ n / g, '') code> ety.replace (/ \ n / g, '') code> 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 code>,'1ä4 ±' === '1ä4 ±' true code>, afin que les valeurs sont identiques@ Ken-abdiassoftwareware:
x.length code> donne 6 etY.Length code> donne 7. @akonsu: j'ai édité mon message, voici comment il fonctionne actuellement.Utiliser
=== code> et que se passe-t-il alors