根据this question,URL片段(即URL中#后面的部分)中应禁止使用许多字符(#,<,>,[,],{,},...)。 )。但是我写的测试脚本似乎表明大多数当前的浏览器都允许其中一些字符:
const unsupported = [];
for (let charCode = 32; charCode < 127; charCode++) {
const c = String.fromCharCode(charCode);
window.location = `#${c}`;
const afterRoundtrip = window.location.href.match(/#(.*)/)[1];
const characterIsSupported = afterRoundtrip === c;
if (!characterIsSupported) {
unsupported.push(c);
}
}
console.log('Unsupported: ', unsupported);
此脚本遍历所有可打印的ASCII字符,尝试将每个字符附加到散列后的URL上,将其读回,并输出浏览器不允许的字符。
在Chrome上,输出为[" ", """, "<", ">", "`"]
;在Safari和Edge上,都是[" "]
。因此似乎URL片段中几乎允许所有ASCII字符。
我很困惑:浏览器是否应该在URL片段中允许所有这些特殊字符?如果是这样,我可以依靠这种行为并将这些字符用于单页应用程序吗?有一些我不知道的标准吗?