2009-03-06 32 views
42

別の質問に答えるには、私はまだ私はescape/unescapeを使ってURLコンポーネントの内容をエンコードしていますが、JavaScriptの/ DOMの知識はちょっと古くなっていたことに気付いたのですが、代わりにencodeURIComponent/decodeURIComponentdecodeURIComponentとunescapeの違いは何ですか?unescapeの問題は何ですか?

私が知りたいのは、escape/unescapeで間違っていますか? Unicode文字には何らかの問題があるというあいまいな提案がありますが、明確な説明はありません。

私のWebエクスペリエンスはかなり偏っていますが、ほとんどすべてがInternet Explorerに接続された大きなイントラネットアプリケーションを作成しています。それはescape/unescapeの多くを使用しており、関連するアプリケーションは長年にわたって完全にUnicodeをサポートしています。

したがって、escape/unescapeにはどのようなUnicode問題がありますか?誰もが問題を実証するためのテストケースを持っていますか?

+0

を働いて、このです –

+0

優秀、ちょうど私が望んでいた。私は、MozillaがエスケープでUnicodeに対処していないという問題があることを知っています。なぜなら、IE onlyアプリケーションを使用して問題に遭遇していない理由を説明しているからです。 – andynormancx

+0

私はIEだけのイントラネットアプリケーションで作業していた私の歴史に祝福され、呪われています。私はIE/FFの違いに対処する必要は全くなく、同じ理由で呪われていないので祝福されます。 – andynormancx

答えて

37

私が知りたいことは、エスケープ/エスケープに間違っていることですか?

彼らは「間違っている」わけではありません。それらはURIパラメータエンコーディングのように見えますが、実際はそうではありません。特に:

  • '+' UnicodeのUTF-16コード・ポイントを符号化するための特別な「%uNNNN」形式ではなく、符号化UTF-8バイトであり、
  • ない空間、手段プラス

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

エスケープ()は、内部のJavaScriptのみのエンコーディングスキームとして使用できます(たとえば、Cookie値をエスケープする場合など)。しかし、すべてのブラウザがencodeURIComponentをサポートするようになりました(元々はそうではありませんでした)ので、エスケープを優先する必要はありません。

あり、私の知っているエスケープ/エスケープ解除のための唯一の近代的な使用であり、それはURIComponent取り扱いにUTF-8処理を活用することで、UTF-8のエンコーダ/デコーダを実装する簡単な方法としては:

utf8bytes= unescape(encodeURIComponent(unicodecharacters)); 
unicodecharacters= decodeURIComponent(escape(utf8bytes)); 
+0

参考文献:http://unixpapa.com/js/querystring.html - 廃止予定エスケープ/アンエスケープ、ダムencodeURI/decodeURI、decodeURIComponent/encodeURIComponent - quirksとその使い方decodeURIComponentは "+"をスペースに変換しません。 –

+0

エスケープは単一引用符をエスケープしますが、encodeURIはエスケープしません。それは私のプロジェクトにとって役に立たない。 –

+0

bobince-私は現在、そのアプローチを使用してutf8bytes = unescape(encodeURIComponent(unicodecharacters))を取得しています。ブラウザーがエスケープメソッドをサポートしなくても、どうすれば同じ結果が得られますか?ありがとう。 – acabra85

4

私が実行した別の「現代的な」使用法は、無効なUTF8バイトシーケンスを含むURIエンコードされた文字列を解析することです。場合によっては、decodeURIComponentが例外をスローすることがあります。この例外をキャッチして、unescapeを使用する必要があります。

「tür」は、Firefoxが生成したのと同じように 't%FCr'としてエンコードされています(?の後のアドレスバーに文字が貼り付けられたとき)。

+0

Firefoxでバグが修正されたようです。しかし、UTF-8ではなくISO-8859-1を使用して文字を誤ってエンコードする人はいないでしょう。 –

7

escapeは、0〜255の範囲の文字(ISO-8859-1、有効に1バイトで表現可能なUnicodeコードポイント)でのみ動作します。

encodeURIComponentは、javascriptが表すことができるすべての文字列(現在のほとんどの人間の書記体系に対応するユニコードの基本的な多言語面、つまりユニコードコードポイント0〜1,114,111または0x10FFFF)で動作します。

両方の関数は、最初にUTF-8として文字列をエンコードし、次にescapeから馴染みのある16進数のエンコーディングを適用することによって達成する、0から127までのコードポイント(US-ASCII)安全ではないコードポイント。 unescapedecodeURIComponentバージョンは逆に同じことを行うようごループやごみ発電無しmake a two-funcall UTF-8 encoder/decoder JavaScriptでは、これらのプリミティブを組み合わせることにより、UTF-8処理の副作用はなく、すべてを相殺することができる理由

この

は偶然にあります。

(*)フットノート:Google Chromeのような最近のブラウザのいくつかは、上記の255文字の範囲で%uXXXXを生成するよう調整されていますが、エスケープは当初は定義されていませんでした。 IETF標準化されたUTF-8ベースのエンコーディングのデコードとしてよく実装されています。

6

最良の答えは、私はこのそれかなりよく(http://xkr.us/articles/javascript/encode-compare/)[記事ではカバー]だと思う、それはこのウェブサイト上のオンラインhttp://meyerweb.com/eric/tools/dencoder/

function decode() { 
    var obj = document.getElementById('dencoder'); 
    var encoded = obj.value; 
    obj.value = decodeURIComponent(encoded.replace(/\+/g, " ")); 
} 
関連する問題