根据RFC 3986,以下字符是保留的,需要进行百分比编码才能在 URI 中使用,而不是作为保留用途:
:/?#[]@!$&'()*+,;=
此外,它指定了一些特别未保留的字符:a-zA-Z0-9\-._~
似乎很清楚,通常应该对保留字符进行编码(以防止误解)而不是对未保留的字符进行编码(为了便于阅读),但是不属于任一类别的字符应该如何处理呢?例如{
并且}
不在任一列表中出现,但它们是标准的 ASCII 字符。
向现代浏览器寻求指导,似乎它们有时具有不同的行为。例如,考虑将 URL 粘贴https://www.google.com/search?q={
到 Web 浏览器的地址栏中:
- Chrome 34.0.1847.116 m 不会改变它。
- Firefox 28.0 没有改变它。
- Internet Explorer 9.0 不会改变它。
- Safari 5.1.7 将其更改为
https://www.google.com/search?q=%7B
但是,如果粘贴https://www.google.com/#q={
(删除“搜索”并将 更改?
为 a #
,使字符成为片段/哈希的一部分而不是查询字符串),我们会发现:
- Chrome 34.0.1847.116 m 将其更改为
https://www.google.com/#q=%7B
(通过 JavaScript) - Firefox 28.0 没有改变它。
- Internet Explorer 9.0 不会改变它。
- Safari 5.1.7 将其更改为
https://www.google.com/#q=%7B
(在执行 JavaScript 之前)
此外,当使用 JavaScript 异步执行请求时(即使用这个 MDN 示例修改为使用 的 URL ?q={
),URL 不会自动进行百分比编码。(我猜这是因为 XMLHttpRequest API 假设 URL 是预先编码/转义的。)
我想(出于与奇怪的客户要求相关的原因)在 URL 的文件名部分中使用{
和,而不会(1)破坏事物,理想情况下也不会(2)在现代网络面板中创建难看的百分比编码条目}
浏览器的网络检查器/调试器。