URL 编码

URL 编码(也称为百分号编码,Percent-Encoding)是一种在 URL 中传输非 ASCII 字符和保留字符的机制,符合 RFC 3986 标准。


一、为什么需要 URL 编码?

因为 URL 只能包含以下几类字符:

字符类型示例
英文字母A-Za-z
数字0-9
安全字符- _ . ~
保留字符(特殊意义): / ? # [ ] @ & = + $ ,

其他字符(如空格、中文、特殊符号)必须编码后才能出现在 URL 中,以避免语义冲突。


二、URL 编码规则

原始字符编码形式说明
空格%20+application/x-www-form-urlencoded 中是 +
!%21
#%23锚点标识,需编码
%%25百分号本身需编码
+%2B和空格冲突,需编码
/%2F路径分隔符,若用于参数需编码
中文、非 ASCIIUTF-8 后编码如: → UTF-8:E4B8AD%E4%B8%AD

三、示例对比

原始参数编码后 URL 片段
keyword=中 文keyword=%E4%B8%AD%20%E6%96%87
a+b=ca%2Bb=c
a&b=ca%26b=c
123#456123%23456

四、编码与解码:各语言示例

Java

String encoded = URLEncoder.encode("中 文", "UTF-8");  // %E4%B8%AD+%E6%96%87
String decoded = URLDecoder.decode(encoded, "UTF-8"); // 中 文

JavaScript

encodeURIComponent("中 文");   // "%E4%B8%AD%20%E6%96%87"
decodeURIComponent("%E4%B8%AD%20%E6%96%87");

Python

import urllib.parse
urllib.parse.quote("中 文")   # %E4%B8%AD%20%E6%96%87
urllib.parse.unquote('%E4%B8%AD%20%E6%96%87')

五、常见编码函数差异(前端注意!)

函数是否编码空格是否编码 /用途
encodeURI❌(保留空格)编码整个 URL,不编码分隔符
encodeURIComponent%20%2F编码 URL 的参数值部分

六、常见错误与陷阱

错误使用正确做法
中文直接拼到 URL 中使用 UTF-8 编码后再转为 %xx
+ 表示加号+ 要转义为 %2B
忘记对查询参数做编码所有参数值都要 encodeURIComponent()
多次编码造成错误避免重复 encode/decode

七、应用场景

场景是否需要 URL 编码
GET 请求参数✅ 是
POST 表单提交(application/x-www-form-urlencoded)✅ 是(空格转 +
浏览器地址栏直接输入中文浏览器自动编码
JSON 接口、application/json❌ 一般不编码

总结

  • URL 编码是为了解决 URL 中无法直接使用某些字符的问题
  • 参数值使用 encodeURIComponent() 是最安全的方式
  • 中文、空格、特殊符号必须编码成 %XX 格式
  • 多数开发语言提供标准函数支持编码/解码

### URL编码的使用方法及规则 URL编码(Percent-Encoding)是一种用于在URL中传输特殊字符的编码方式。由于URL只能使用有限的字符集(主要是ASCII字符),而实际应用中可能包含许多特殊字符(如空格、中文字符、标点符号等),URL编码通过将这些特殊字符转换为可传输的格式,确保了URL的正确性和安全性[^1]。 #### 编码规则 URL编码遵循以下规则: 1. 非字母数字字符会被替换为 `%` 后跟两个表示字符ASCII值的十六进制数字。例如,空格会被编码为 `%20`。 2. 某些保留字符(如 `&`, `=`, `?` 等)即使属于ASCII字符集,也会被编码以避免歧义。例如,`&` 会被编码为 `%26`。 3. 对于非ASCII字符(如中文字符),通常先将其转换为UTF-8字节序列,然后对每个字节进行百分号编码。例如,中文字符“你好”在UTF-8编码下会被转换为 `%E4%BD%A0%E5%A5%BD`[^2]。 #### 使用方法 URL编码广泛应用于以下场景: 1. **URI/URL**:当需要在URL中传递参数时,所有特殊字符都需要进行URL编码[^3]。 2. **表单提交**:当浏览器提交表单时,会根据请求体格式 `application/x-www-form-urlencoded` 对表单数据进行编码。具体规则如下: - 每对 `name/value` 参数由 `&` 符号分隔。 - 每个 `name` 和对应的 `value` 由 `=` 符号分隔。 - 如果用户没有输入值给某个 `name`,则该 `name` 仍会出现,但无值[^4]。 #### 示例代码 以下是一个简单的Python示例,展示如何对字符串进行URL编码: ```python import urllib.parse # 原始字符串 original_string = "Hello, 你好! This is a test." # 使用urllib库进行URL编码 encoded_string = urllib.parse.quote(original_string) print("原始字符串:", original_string) print("URL编码后的字符串:", encoded_string) ``` 运行结果: ``` 原始字符串: Hello, 你好! This is a test. URL编码后的字符串: Hello%2C+%E4%BD%A0%E5%A5%BD%21+This+is+a+test. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值