2009-11-09 14 views
36

Czy window.location.hash zawiera zakodowaną lub odkodowaną reprezentację części adresu URL?Kodowanie window.location.hash

Kiedy otwieram ten sam adres URL (http://localhost/something/#%C3%BC gdzie %C3%BC przekłada się ü) Firefox 3.5 i Internet Explorer 8, otrzymuję różne wartości dla document.location.hash:

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

Czy istnieje sposób na uzyskanie jednego wariantu w obu przeglądarkach?

Odpowiedz

37

Niestety, jest to błąd w Firefoksie, ponieważ dekoduje location.hash dodatkowy czas, gdy jest on dostępny. Na przykład, spróbuj tego Firefox:

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

Jedynym rozwiązaniem cross-browser jest po prostu użyć (location.href.split("#")[1] || "") zamiast uzyskania hash. Ustawienie wartości mieszania za pomocą location.hash wydaje się działać poprawnie dla wszystkich przeglądarek obsługujących location.hash.

+0

Tak, to wydaje się być najbardziej rozsądnym rozwiązaniem. – Michael

+0

Ten test zwraca "false" pod Firefox 10.0.1 co najmniej. Nie jestem pewien, kiedy to się zmieniło, ale oczywiście jeśli chcesz wspierać starsze wersje, to nadal jest najlepsza rada. – hippietrail

+1

Co jeśli część hash zawiera #? W takim przypadku metoda podziału nie będzie działać. – Christophe

0

Faktycznie w mojej wersji Firefoksa (3.5) w systemie Linux, jeśli wpiszesz "#% C3% BC" jako hash w adresie URL, sama URL faktycznie przekształca Unicode z "# ü". Wygląda na to, że odpowiedziałeś na własne pytanie - w przeglądarce Firefox przeglądarka przekształca kody ucieczki encji w adres URL, podczas gdy w IE nie.

Moja rada brzmi: zamiast wstawiać "#% C3% BC" w adresie URL, po prostu użyj pełnego Unicode w hasłach i adresach URL. Czy to jest opcja? Powinno działać dobrze w każdej nowoczesnej przeglądarce.

+3

Nie, to nie jest :(Twój Firefox (i mój też) po prostu udaje, że używa znaku 'ü' W HTTP zawsze używa kodowania procentowego. Przesuń mysz nad ten link: http: // test /% C3% BC Pasek stanu Firefoksa pokazuje 'ü' z jakiegoś powodu, ale jeśli użyjesz sniffera HTTP, dowiesz się, że przesyła on'% C3% BC'. Zasadniczo, ponieważ jestem używając tego w przekierowaniu HTTP, nie mogę bezpośrednio używać znaków Unicode.) – Michael

+0

Czy jesteś pewien, że nie zależy to od kodowania kodu ASCII? kodowanie Unicode? –

+0

AFAIK nie ma sposobu na transfer znaków Unicode w HTTP bez specjalnego przygotowania podobnie jak kodowanie procentowe (ponieważ HTTP nie zezwala na znaki spoza zakresu ASCII). – Michael

1

Można użyć decodeURIComponent, zwróci we wszystkich przypadkach:

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

Wypróbuj here.

+2

Nie jest rozwiązaniem, ponieważ: 'decodeURIComponent ('% 2540'); //% 40 (IE) ' ale ' decodeURIComponent ('% 40'); // @ (FF) ' – Michael

+0

Nie jestem pewien co masz na myśli,% 2540 to zakodowany znak% '('% 25') i nie zakodowany ciąg '40',' decodeURIComponent ('% 40 '); ' is @ in IE lub Firefox ... http://jsbin.com/esafe – CMS

+4

Załóżmy, że chcę użyć skrótu do funkcji wyszukiwania i ktoś chce wyszukać '% 40' (ale nie dla' @ '). W zależności od jego przeglądarki, otrzymam '#% 2540' (IE) lub' #% 40' (FF) jako 'location.hash'. Jeśli ją odszyfruję, otrzymam różne wyniki w różnych przeglądarkach. – Michael

4

Odpowiadając na moje własne pytanie, moje obecne rozwiązanie jest do analizowania window.location.href zamiast korzystania window.location.hash, ponieważ ta pierwsza jest zawsze (to znaczy w każdej przeglądarce) url zakodowane. W związku z tym proponowana funkcja może być zawsze bezpiecznie używana. YUI robi to samo, dlatego nie może być tak źle ...