53

別の質問に答えると、URL コンポーネントのコンテンツをエンコードするためにまだescape/を使用しているという点で、Javascript/DOM の知識が少し古くなっていることに気付きましたが、代わりに/を使用する必要があるようです。unescapeencodeURIComponentdecodeURIComponent

私が知りたいのは、escape/の何が問題なのかということunescapeです。Unicode 文字に何らかの問題があるという漠然とした提案がいくつかありますが、明確な説明は見つかりません。

私の Web 経験はかなり偏りがあり、ほとんどすべてが Internet Explorer に関連付けられた大規模なイントラネット アプリを作成することでした。escapeこれには/の多くの使用が含まunescapeれており、関連するアプリは何年も前から Unicode を完全にサポートしています。

escapeでは、 /unescapeが持つはずの Unicode の問題は何ですか? 問題を実証するためのテストケースはありますか?

4

4 に答える 4

44

私が知りたいのは、エスケープ/ウンエスケープの何が問題なのですか?

それ自体は「間違っている」わけではなく、URI-parameter-encoding に少し似ていますが、実際にはそうではない独自の特殊な文字列形式にすぎません。特に:

  • 「+」はスペースではなくプラスを意味します
  • UTF-8 バイトをエンコードする代わりに、Unicode UTF-16 コード ポイントをエンコードするための特別な「%uNNNN」形式があります。

したがって、escape() を使用して URI パラメータ値を作成すると、プラス記号または非 ASCII 文字を含む文字列に対して間違った結果が得られます。

escape() は、たとえば Cookie 値をエスケープするために、内部 JavaScript 専用エンコーディング スキームとして使用できます。しかし、すべてのブラウザーが encodeURIComponent をサポートするようになったので (これは元々そうではありませんでした)、それよりもエスケープを使用する理由はありません。

私が知っているエスケープ/ウンエスケープの最新の使用法は 1 つだけです。これは、URIComponent 処理で UTF-8 処理を利用することにより、UTF-8 エンコーダー/デコーダーを実装する簡単な方法です。

utf8bytes= unescape(encodeURIComponent(unicodecharacters));
unicodecharacters= decodeURIComponent(escape(utf8bytes));
于 2009-03-06T16:24:33.630 に答える
11

escape0から255までの範囲の文字でのみ動作します(ISO-8859-1、これは事実上、1バイトで表現可能なユニコードコードポイントです)。(*)

encodeURIComponentjavascriptが表すことができるすべての文字列に対して機能します(これは、ユニコードの基本的な多言語面の全範囲です。つまり、現在使用されているほとんどすべての人間の書記体系をカバーするユニコードコードポイント0〜1,114,111または0x10FFFF)。

どちらの関数も、コードポイント0〜127(US-ASCII)のみを使用するURLセーフ文字列を生成します。後者は、最初に文字列をUTF-8としてエンコードし、次に、%XXからおなじみの16進エンコードを適用escapeしないコードポイントに適用します。 URLを安全に。

ちなみに、これらのプリミティブを組み合わせてUTF-8処理の副作用を除くすべてをキャンセルすることで、ループやガベージの生成なしにjavascriptで2つのfuncallUTF-8エンコーダー/デコーダーを作成できるのはこのためです。逆に同じです。unescapedecodeURIComponent

(*)脚注:Google Chromeなどの一部の最新のブラウザは上記の%uXXXXを生成するように調整されています-255文字の範囲のエスケープは元々定義されていませんでしたが、そのエンコーディングをデコードするためのWebサーバーのサポートはそれほど適切に実装されていませんIETF標準化されたUTF-8ベースのエンコーディングをデコードします。

于 2012-10-07T20:36:37.620 に答える
7

最良の答えは、この Web サイトhttp://meyerweb.com/eric/tools/dencoder/でオンラインで作業していることです。

function decode() {
    var obj = document.getElementById('dencoder');
    var encoded = obj.value;
    obj.value = decodeURIComponent(encoded.replace(/\+/g,  " "));
}
于 2013-11-16T01:00:16.580 に答える
7

私が遭遇したもう 1 つの "現代的な" 使用法は、無効な UTF8 バイト シーケンスを含む可能性がある URI エンコードされた文字列を解析することです。場合によっては、decodeURIComponent が例外をスローすることがあります。この例外をキャッチして、unescape を使用するようにフォールバックする必要がある場合があります。

例としては、't%FCr' としてエンコードされた 'tür' があり、これは Firefox が生成するのを見てきました (? の後に文字がアドレス バーに貼り付けられた場合)。

于 2011-10-11T12:52:54.260 に答える