Javascript string Vergleich fehlschlägt beim Vergleich von unicode-Zeichen
Möchte ich zum vergleichen von zwei strings in JavaScript, dass sind die gleichen, und doch ist der Gleichheits-operator ==
gibt false zurück. Ein string enthält Sie ein Sonderzeichen (zB. die Dänische å
).
JavaScript-code:
var filenameFromJS = "Designhåndbog.pdf";
var filenameFromServer = "Designhåndbog.pdf";
print(filenameFromJS == filenameFromServer); //This prints false why?
Die Lösung
Was für mich gearbeitet ist unicode-Normalisierung als slevithan hingewiesen.
Ich Gabel meine original-jsfiddle um eine version, die mithilfe der Normalisierung lib vorgeschlagen slevithan. Link: http://jsfiddle.net/GWZ8j/1/.
- Finden Sie in diesem Artikel über
==
vs.===
stackoverflow.com/questions/359494/... - Wenn beide Operanden sind vom gleichen Typ, es spielt keine Rolle, wenn Sie Locker oder streng-Vergleich.
- Dies ist auch sehr nützlich: joelonsoftware.com/2003/10/08/... (Was jeder Entwickler benötigt, um wissen über unicode und Zeichensätze)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Gegensatz zu dem, was einige andere Leute hier gesagt haben, das hat nichts zu tun mit Codierungen. Eher, deine beiden strings verwenden unterschiedliche code-Punkte zu erbringen die gleiche visuelle Zeichen.
Zu lösen, um das richtig zu können, müssen Sie die Unicode-Normalisierung auf die beiden Zeichenfolgen vor dem vergleichen. Nur leider, JavaScript nicht haben diese Funktionalität eingebaut. Hier ist eine JavaScript-Bibliothek, die Normalisierung für Sie: https://github.com/walling/unorm
CC 8A
ist die UTF-8-code-Sequenz fürU+30A COMBINING RING ABOVE
, die vorangestellt ista
. Die andere saite hatC3 A5
codiertU+00E5 LATIN SMALL LETTER A WITH RING ABOVE
in UTF-8. Wenn ich mich Recht erinnere, Mac OS bevorzugt die Kombination von Zeichen, während andere Betriebssysteme, die lieber die single-Glyphe form. Es sollte möglich sein, den server, konvertieren entweder, aber so gibt es keine großen client-seitige Bibliothek notwendig.JavaScript Gleichheitsoperator
==
wird angezeigt, um zu scheitern, unter den folgenden Umständen. In allen Fällen ist es die Programmierer Fehler. Ein Fehler im JavaScript.Den beiden strings enthalten nicht die gleiche Anzahl und Reihenfolge der Zeichen.
Gibt es Leerzeichen oder Zeilenumbrüche vor, innerhalb oder nach einer Zeichenfolge. Verwenden Sie ein trim () - operator auf beide und schauen Sie genau auf beiden Saiten.
Überraschung typecasting. Der Programmierer ist der Vergleich von Datentypen, die nicht kompatibel sind.
Gibt es unicode-Zeichen, die identisch Aussehen, um andere unicode-Zeichen, aber in der Tat sind unterschiedliche unicode-Zeichen.
UTF-8 ist eine komplexe Sache. Das charset hat zwei unterschiedliche codes für Zeichen wie á, é, etc. Wie Ihr schon seht, in die URL-kodierte version, die HEX-bytes, die das Zeichen gemacht wird, unterscheiden sich für beide Versionen.
Sehen diese Antwort für weitere Informationen.
<meta charset=UTF-8>
(HTML5) oder<meta http-equiv=Content-Type content='text/html; charset=UTF-8'>
jedoch so, dass ist etwas irreführend.Hatte ich das gleiche problem.
Hinzufügen
in der HTML-Datei das Problem behoben wurde.
In meinem Fall die Template-engine Backen einen json-string in die HTML-Datei. Dieser string in unicode.
Während die Vorlage war auch eine unicode-Datei, die JS-engine war die Behandlung der Zeichenfolge, die ich schrieb in der Vorlage als latin-1 kodierten string, bis ich fügte hinzu, das meta-tag.
War ich vergleicht die eingegebene Zeichenkette zu einer der JSON-Objekte Gegenstände (
location.title == "Mühle"
)