Кодировка window.location.hash

Поддерживает ли window.location.hash кодированное или декодированное представление части url?

Когда я открываю тот же url (http://localhost/something/#%C3%BC, где %C3%BC переводит на ü) в Firefox 3.5 и Internet Explorer 8, я получаю разные значения для document.location.hash:

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

Есть ли способ получить один вариант в обоих браузерах?

Ответ 1

К сожалению, это ошибка в 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.

Ответ 2

Отвечая на мой собственный вопрос, моим текущим решением является разбор window.location.href вместо использования window.location.hash, потому что первый всегда (т.е. в каждом браузере) закодирован в url. Поэтому предлагаемая функция C decodeURIComponent всегда может быть использована безопасно. YUI делает то же самое, поэтому не может быть так плохо...

Ответ 3

Вы можете использовать decodeURIComponent, он вернет во всех случаях:

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

Попробуйте здесь.

Ответ 4

Собственно, в моей версии Firefox (3.5 на Linux), если я набираю "#% C3% BC" как хэш в URL-адресе, сам URL-адрес фактически преобразуется в unicode с помощью "# ü". Но вы, кажется, ответили на свой вопрос - в Firefox браузер преобразует escape-коды сущностей в URL-адрес, а в IE - нет.

Мой совет на самом деле заключается в следующем: вместо того, чтобы помещать "URL% C3% BC" в URL-адрес вообще, просто используйте полный юникод в своих хэшах и URL-адресах. Это вариант? Он должен хорошо работать в любом современном браузере.