15

JavaScript で同じ 2 つの文字列を比較したいのですが、等価演算子==が false を返します。1 つの文字列に特殊文字が含まれています (たとえば、デンマーク語å)。

JavaScript コード:

var filenameFromJS = "Designhåndbog.pdf";
var filenameFromServer = "Designhåndbog.pdf";

print(filenameFromJS == filenameFromServer); // This prints false why?

私にとってうまくいったのは、 slevithan が指摘したようにUnicodeの正規化です。

元の jsfiddle をフォークして、slevithan によって提案された正規化ライブラリを使用してバージョンを作成しました。リンク: http://jsfiddle.net/GWZ8j/1/ .

4

5 に答える 5

13

ここにいる他の人が言ったこととは異なり、これはエンコーディングとは何の関係もありません。むしろ、2つの文字列は、同じ視覚的文字をレンダリングするために異なるコードポイントを使用します。

これを正しく解決するには、2つの文字列を比較する前に、2つの文字列に対してUnicode正規化を実行する必要があります。残念ながら、JavaScriptにはこの機能が組み込まれていません。正規化を実行できるJavaScriptライブラリは次のとおりです:https ://github.com/walling/unorm

于 2012-05-29T20:03:29.190 に答える
6

JavaScript 等値演算子==は、次の状況では失敗しているように見えます。いずれの場合も、プログラマ エラーです。JavaScript のバグではありません。

  1. 2 つの文字列に含まれる文字の数と順序が同じではありません。

  2. 1 つの文字列の前、中、または後に空白または改行があります。両方で trim() 演算子を使用し、両方の文字列をよく見てください。

  3. 驚きの型キャスト。プログラマは、互換性のないデータ型を比較しています。

  4. 他の Unicode 文字と同じように見えるが、実際には異なる Unicode 文字である Unicode 文字があります。

于 2013-10-29T03:17:39.337 に答える
1

UTF-8 は複雑なものです。文字セットには、á、é などの文字の 2 つの異なるコードがあります。URL エンコードされたバージョンで既にわかるように、文字を構成する HEX バイトは両方のバージョンで異なります。

詳細については、この回答を参照してください。

于 2012-05-29T19:54:31.267 に答える