什么是 UrlEncode

Posted on Wed, 25 Dec 2024 10:34:29 +0800 by LiangMingJian


概述

在网络访问过程中,我们常常在复制网址的时候可以看见这样的内容:https://cn.bing.com/search?q=%E8%B5%B7%E7%82%B9,这个内容在浏览器中实际表示的是 https://cn.bing.com/search?q=起点,为什么会出现这种状况?

这是因为在网络传输过程中,URL(统一资源定位符,网址)中的某些字符(如空格、特殊符号、中文字符等)可能无法传输,或者被浏览器或服务器误解,容易导致链接失效或数据错误。因此,浏览器会自动的将这些字符进行编码转换,确保信息在传输过程中不被篡改或丢失。

上述的这种编码转换使用的就是 UrlEncode(URL 编码)。

什么是 UrlEncode

UrlEncode 是一种将 URL 中的特殊字符转换为特定格式字符的编码方式。

UrlEncode 通过将字符转换为 ASCII 码的十六进制表示,并在前面加上百分号(%)来标识,使得所有不符合规格的字符变更为 %+ASCII 的格式。

UrlEncode 的使用确保了确保 URL 中的特殊字符能被所有浏览器和服务器正确解析;防止恶意字符注入攻击,如 SQL 注入;以及统一 URL 的表示形式,避免因地区字符差异导致的链接失效。

UrlEncode 的编码规则

UrlEncode 的转换遵循以下的规则:

‌字母和数字:直接保留,无需二次编码。

‌特殊字符:% 后跟对应字符 ASCII 码的两位十六进制数。

符号空格!"#$%
URL 编码%20%21%22%23%24%25
ASCII 码202122232425

ASCII 码对照可查看 ASCII码对照表

非 ASCII 字符‌(如中文):先转换为 UTF-8 字节流序列,然后在每一个字节前添加 %。

比如,你好 以 UTF-8 转换后,字节流有 E4BDA0E5A5BD,对应 16 进制有 \xE4\xBD\xA0\xE5\xA5\xBD,以每两个字符为一个字节,在字节前添加 % 完成 UrlEncode 有 %E4%BD%A0%E5%A5%BD。

JavaScript UrlEncode 编解码实现

// URL 编码
function urlEncode(str) {
    return encodeURIComponent(str);
}

// URL 解码
function urlDecode(str) {
    return decodeURIComponent(str);
}

Python UrlEncode 编解码实现

# URL 编码
def url_encode(text):
    return urllib.parse.quote(text, safe=':/?=&')

# URL 解码
def url_decode(text):
    return urllib.parse.unquote(text)