web-dev-qa-db-ja.com

window.location.hashのエンコーディング

window.location.hashには、URL部分のエンコードまたはデコードされた表現が含まれていますか?

Firefox3.5とInternetExplorer 8で同じURL(http://localhost/something/#%C3%BCここで%C3%BCüに変換されます)を開くと、document.location.hashの値が異なります。

  • IE8:#%C3%BC
  • FF3.5:

両方のブラウザで1つのバリアントを取得する方法はありますか?

41
Michael

残念ながら、これはFirefoxのバグであり、アクセス時にlocation.hashを余分にデコードします。たとえば、Firefoxでこれを試してください。

location.hash = "#%30";
location.hash === "#0"; // This is wrong, it should be "#%30"

唯一のクロスブラウザソリューションは、ハッシュを取得する代わりに(location.href.split("#")[1] || "")を使用することです。ただし、location.hashを使用してハッシュを設定すると、location.hashをサポートするすべてのブラウザで正しく機能するようです。

38
Eli Grey

私自身の質問に答えると、私の現在の解決策は、window.location.hrefを使用する代わりにwindow.location.hashを解析することです。これは、前者が常に(つまり、すべてのブラウザーで)URLエンコードされているためです。したがって、提案されたdecodeURIComponent関数[〜#〜] cms [〜#〜]は常に安全に使用できます。 [〜#〜] yui [〜#〜]同じことをするので、それは間違いではありません...

6
Michael

decodeURIComponent を使用できます。すべての場合にが返されます。

decodeURIComponent('#%C3%BC'); // #ü
decodeURIComponent('#ü'); // #ü

試してみてください ここ

4
CMS

実際、私のバージョンのFirefox(Linuxでは3.5)では、URLにハッシュとして「#%C3%BC」と入力すると、URL自体が実際にtransforms「#ü」でユニコードになります。しかし、あなたはあなた自身の質問に答えているように見えます-Firefoxでは、ブラウザはURLのエンティティエスケープコードを変換しますが、IEでは変換しません。

私のアドバイスは実際にはこれです:URLに「#%C3%BC」を入れる代わりに、ハッシュとURLに完全なUnicodeを使用するだけです。それはオプションですか?最新のブラウザでは問題なく動作するはずです。

0
Ken Kinder