2009-11-09 3 views
36

Il numero window.location.hash contiene la rappresentazione codificata o decodificata della parte dell'URL?Codifica di window.location.hash

Quando apro lo stesso URL (http://localhost/something/#%C3%BC dove %C3%BC traduce ü) in Firefox 3.5 e Internet Explorer 8, ottengo valori diversi per document.location.hash:

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

C'è un modo per ottenere una variante in entrambi i browser?

risposta

37

Purtroppo, questo è un bug in Firefox in quanto decodifica location.hash un tempo supplementare quando vi si accede. Ad esempio, provare questo in Firefox:

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

L'unica soluzione cross-browser è usare solo (location.href.split("#")[1] || "") invece per ottenere l'hash. L'impostazione dell'hash utilizzando location.hash sembra funzionare correttamente per tutti i browser che supportano lo location.hash.

+0

Sì, sembra essere la soluzione più ragionevole. – Michael

+0

Questo test restituisce 'false' almeno in Firefox 10.0.1. Non sono sicuro quando è cambiato, ma ovviamente se vuoi supportare versioni precedenti questo è ancora il miglior consiglio. – hippietrail

+1

Cosa succede se la parte hash contiene un #? In questo caso il metodo split non funzionerà. – Christophe

0

In realtà nella mia versione di Firefox (3.5 su Linux), se digito "#% C3% AC", come un hash nell'URL, l'URL stesso in realtà trasforma a Unicode con "# ü". Ma sembra che tu abbia risposto alla tua stessa domanda: in Firefox, il browser trasforma i codici di escape dell'entità nell'URL, mentre in IE no.

Il mio consiglio è in realtà questo: anziché inserire "#% C3% BC" nell'URL, utilizzare solo unicode completo negli hash e negli URL. È un'opzione? Dovrebbe funzionare bene in qualsiasi browser moderno.

+3

No, non è :(. Il tuo Firefox (e anche il mio) sta solo fingendo di usare un carattere 'ü'. In HTTP usa sempre la codifica percentuale. Muovi il mouse sopra quel link: http: // test /% C3% BC La barra di stato di Firefox mostra un 'ü' per qualche motivo, ma se si utilizza uno sniffer HTTP, si scoprirà che sta inviando'% C3% BC'. E in fondo, perché sono utilizzando quello in un reindirizzamento HTTP, non posso comunque usare direttamente caratteri unicode – Michael

+0

Sei sicuro che non dipende dalla codifica ASCII va codifica unicode? –

+0

AFAIK non c'è modo di trasferire caratteri Unicode in HTTP senza una preparazione speciale come la codifica percentuale (perché HTTP non consente caratteri al di fuori dell'intervallo ASCII). – Michael

1

Si può usare decodeURIComponent, tornerà in tutti i casi:

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

Prova ora here.

+2

Non una soluzione perché: 'decodeURIComponent ('% 2540'); //% 40 (IE) ' ma ' decodeURIComponent ('% 40'); // @ (FF) ' – Michael

+0

Non proprio sicuro di cosa intendi,% 2540 è il carattere'% 'codificato ('% 25') e la stringa '40' non codificata,' decodeURIComponent ('% 40'); ' è @ in IE o Firefox ... http://jsbin.com/esafe – CMS

+4

Supponiamo di voler utilizzare l'hash per una funzione di ricerca e qualcuno vuole cercare '% 40' (ma non per' @ '). A seconda del suo browser, otterrò '#% 2540' (IE) o' #% 40' (FF) come 'location.hash'. Se decodifico allora, ottengo risultati diversi nei vari browser. – Michael

4

Rispondendo alla mia domanda, la mia soluzione attuale è analizzare window.location.href invece di utilizzare window.location.hash, perché il primo è sempre (vale a dire in ogni browser) url-encoded. Pertanto la funzione decodeURIComponentCMS proposta può sempre essere utilizzata in modo sicuro. YUI fa lo stesso, quindi non può essere che di sbagliato ...