Does window.location.hash
contain the encoded or decoded representation of the url part?
When I open the same url (http://localhost/something/#%C3%BC
where %C3%BC
translates to ü
) in Firefox 3.5 and Internet Explorer 8, I get different values for document.location.hash
:
- IE8:
#%C3%BC
- FF3.5:
#ü
Is there a way to get one variant in both browsers?
You can use
decodeURIComponent
, it will return#ü
in all cases:Try it out here.
Answering to my own question, my current solution is to parse
window.location.href
instead of usingwindow.location.hash
, because the former is always (i.e. in every browser) url-encoded. Therefore thedecodeURIComponent
function CMS proposed can always be used safely. YUI does the same, therefore it can't be that wrong...Unfortunately, this is a bug in Firefox as it decodes
location.hash
an extra time when it is accessed. For example, try this in Firefox:The only cross-browser solution is to just use
(location.href.split("#")[1] || "")
instead for getting the hash. Setting the hash usinglocation.hash
seems to work correctly for all browsers that supportlocation.hash
though.Actually in my version of Firefox (3.5 on Linux), if I type "#%C3%BC" as a hash in the URL, the URL itself actually transforms to unicode with "#ü". But you have appeared to answered your own question -- in Firefox, the browser transforms entity escape codes in the URL, while in IE, it does not.
My advice is actually this: Instead of putting "#%C3%BC" in the URL at all, just use full unicode in your hashes and URLs. Is that an option? It should work fine in any modern browser.