概览
如果在浏览器的 URL 地址中包含中文,复制地址出来后中文部分就会被转换变成看起来像乱码一样的字符,当你复制这段字符发给朋友或粘贴到微博或博客上就会显示特别不美观,以下即解释其原理并解决该问题。
以下是浏览器地址栏显示的 URL 地址(url decode):
https://hexingxing.cn/何星星
复制出来后再粘贴后被转换的地址(url encode):
https://hexingxing.cn/%E4%BD%95%E6%98%9F%E6%98%9F
RFC3986 文档
为了避免不受识别的字符影响 URL 的解析,根据 RFC3986 文档规定,URL 中只允许包含以下四种字符:
1、英文字母(a-z/A-Z)
2、数字(0-9)
3、-_.~ 4 个特殊字符
4、所有保留字符,RFC3986 中指定了以下字符为保留字符(英文字符):
! * ' ( ) ; : @ & = + $ , / ? # [ ]
URL 编码通常也被称为百分号编码(URL Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用% 百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。URL 编码默认使用的字符集是 US-ASCII。例如 a 在 US-ASCII 码中对应的字节是 0x61,那么 URL 编码之后得到的就是%61,我们在地址栏上输入 https://www.baidu.com/s?wd=%61%62%63,实际上就等同于在百度上搜索 abc。又如 @符号在 ASCII 字符集中对应的字节为 0x40,经过 URL 编码之后得到的是%40。
对于非 ASCII 字符,需要使用 ASCII 字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于 Unicode 字符,RFC 文档建议使用 utf-8 对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用 UTF-8 字符集得到的字节为 0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过 URL 编码之后得到"%E4%B8%AD%E6%96%87"。
如果某个字节对应着 ASCII 字符集中的某个非保留字符,则此字节无需使用百分号表示。例如"URL 编码",使用 UTF-8 编码得到的字节是 0x55 0x72 0x6C 0xE7 0xBC 0x96 0xE7 0xA0 0x81,由于前三个字节对应着 ASCII 中的非保留字符"URL",因此这三个字节可以用非保留字符"URL"表示。最终的 URL 编码可以简化成"URL%E7%BC%96%E7%A0%81" ,当然,如果你用"%55%72%6C%E7%BC%96%E7%A0%81"也是可以的。
列举带有特殊字符的参数替换成另一些代替的参数:
字符 - URL 编码值
- %20 (空格)
" - %22
# - %23
% - %25
& - %26
( - %28
) - %29
+ - %2B
, - %2C
/ - %2F
: - %3A
; - %3B
- %3E
? - %3F
@ - %40
\ - %5C
| - %7C
{ - %7B
} - %7D
解决这个问题
解释了原因后,目前要解决复制 Chrome 谷歌浏览器地址栏内包含中文的 URL 不被转换,简单做以下操作即可。
有两种情况,一种是 https 网页,即是拥有证书的网站,一种是 http 网页,这些一般是没有证书或证书不受信任;
1.https 网页
Chrome 谷歌浏览器默认隐藏 https://或 http://部分,双击地址栏的网址后就会显示完整地址,如下,只复制不包含 https://部分的网址即可实现不被转换中文字符;
2.http 网页
对于 http 网页,双击地址栏无法如同 https 网页一样显示完整地址,在无论是 https 还是 http 的页面场景,右键浏览器的地址栏,然后勾选【总是显示完整网址】,就可以永久显示完整的网址,再同 https 网页一样复制不包含 http://部分的网址即可实现不被转换中文字符;
如果需要将转码的网址再反转,请通过以下网站实现。
https://cafewebmaster.com/online_tools/rawurldecode
0 条评论