logo
GeekFormat

URL 编码

编码规范
URL 输入
0 chars

免费在线 URL 编码解码工具,支持 encodeURIComponent / encodeURI / RFC 3986 四种编码模式。编码高亮实时显示被转义字符,批量模式支持多行处理,Query Only 只编码参数值。浏览器本地处理零上传。

相关推荐

适用场景

  • API 参数调试:对比 encodeURIComponent 和 encodeURI 输出差异,排查接口签名不匹配问题
  • 日志解码:批量解码日志中的 URL 编码内容,还原可读文本
  • URL 构建:Query Only 模式保留键名只编码参数值,避免手动拼接导致的格式错误
  • 前端开发:编码高亮帮助理解哪些字符会被转义,调试页面跳转和重定向
  • 数据迁移:批量处理旧系统导出的 URL 编码数据,转换为新格式

功能特点

  • 四种编码模式:encodeURIComponent / encodeURI / full / RFC 3986 一键切换,实时对比不同规则输出差异
  • 编码高亮:实时高亮显示被转义的 %XX 字符,琥珀色标记让编码结果一目了然
  • 批量模式:支持多行批量编码解码,每行独立处理,适合处理日志或批量数据
  • Query Only 模式:只编码 URL 参数值部分(等号后内容),保留键名、符号和路径结构不变
  • 实时防抖:300ms 自动编码解码,无需点击按钮,输入即出结果
  • 字符统计:实时显示输入字符数,方便核对 API 参数长度限制

使用方法

  1. 输入或粘贴需要编码解码的 URL 或文本
  2. 选择编码方向(编码/解码)和编码模式(Component / URI / full / RFC 3986)
  3. 开启批量模式处理多行数据,或开启 Query Only 只编码参数值部分
  4. 查看高亮结果,复制编码后的字符串用于 API 请求或 URL 拼接

常见问题

encodeURIComponent 和 encodeURI 有什么区别?

encodeURIComponent 会编码所有非安全字符,包括 &、=、? 等,适合编码独立的参数值。encodeURI 保留 URL 结构字符(:、/、?、# 等),适合编码完整 URL。使用场景:参数值用 Component,完整 URL 用 URI。

RFC 3986 和标准编码有什么区别?

RFC 3986 是 URL 标准的更新版本,将波浪号 ~ 视为不需编码的安全字符,而旧标准会将其编码为 %7E。使用 RFC 3986 可以避免部分服务端解析差异,兼容性更好。

Query Only 模式是什么场景用的?

当你有一个 URL 查询字符串 ?name=张三&city=北京,只想编码参数值而不影响键名和符号时使用。此时 name 和 city 保持不变,值被编码为 %E5%BC%A0%E4%B8%89 和 %E5%8C%97%E4%BA%AC。

空格编码用 + 还是 %20?

在 application/x-www-form-urlencoded 格式中(HTML 表单提交),空格编码为 +。但在 URL 路径和 encodeURIComponent 中,空格始终编码为 %20。本工具默认使用 %20 格式。

为什么同一个中文字符不同工具编码结果不同?

这取决于字符编码方式。本工具使用 UTF-8 编码(Web 标准),中文「中」编码为 %E4%B8%AD。如果其他工具使用 GBK 编码,结果会是 %D6%D0。建议统一使用 UTF-8。

编码高亮有什么用?

高亮显示被编码为 %XX 格式的字符(如空格→%20),帮助理解编码规则和排查问题。英文字母和数字是安全字符不会被编码,中文和特殊符号才会被编码。

% 本身需要编码吗?

需要。% 是 URL 编码的转义起始符,如果在参数值中出现字面量 %,必须编码为 %25,否则会被当作编码前缀导致解析错误。例如 100% 需要编码为 100%25。

什么是 URL 编码?

URL 编码(Percent-encoding)是将 URL 中的非安全字符转换为 %XX 格式的过程。URL 只能包含一小部分 ASCII 字符(字母、数字、-_.~),其他所有字符(包括中文、空格、特殊符号)都需要编码后才能在 URL 中传输。例如空格编码为 %20,中文「中」编码为 %E4%B8%AD。

**encodeURIComponent vs encodeURI**:这是两个最常用的编码函数。encodeURIComponent 编码最彻底,包括 &、=、? 等参数分隔符,适合编码单个参数值。encodeURI 保留 URL 结构(协议://、路径、/、?、#),只编码真正需要编码的字符,适合编码完整 URL。混淆使用会导致参数解析错误。

**RFC 3986 vs 旧标准**:RFC 3986 将波浪号 ~ 视为安全字符不需编码,而早期标准会编码为 %7E。使用 RFC 3986 可以减少不必要的转义,提高 URL 可读性,也避免某些服务端对 %7E 的解析问题。

**Query Only 模式**:当你只需要编码 URL 中查询参数的值,而不希望影响键名、等号、& 符号时使用。例如 ?name=张三 编码为 ?name=%E5%BC%A0%E4%B8%89,键名保持可读,只编码值部分。

**编码高亮**:实时高亮 %XX 格式的字符,琥珀色标记让用户一眼看出哪些字符被编码。这帮助理解编码规则:英文字母和数字通常是安全字符不会被编码,中文和特殊符号才会被编码。所有计算在浏览器本地完成,数据不上传。

术语表

Percent-encoding(百分号编码)
URL 编码的正式名称,用 % 后跟两位十六进制数表示字符的编码方式。例如空格编码为 %20,中文「中」编码为 %E4%B8%AD。Wikipedia - Percent-encoding
encodeURIComponent
JavaScript 内置函数,编码除了 A-Z a-z 0-9 - _ . ! ~ * ' ( ) 之外的所有字符。最常用于编码 URL 查询参数的单个值。
encodeURI
JavaScript 内置函数,保留 URL 结构字符(: / ? # [ ] @ ! $ & ' ( ) * + , ; =),仅编码真正需要编码的字符。用于编码完整 URL。
RFC 3986
URI 通用语法的最新 IETF 标准(2005年),定义了 URL 编码的规则,将波浪号 ~ 列为非保留字符(不需编码)。替代了旧的 RFC 2396 和 RFC 1738。RFC 3986
保留字符(Reserved Characters)
URL 中有特殊含义的字符,如 : / ? # [ ] @ ! $ & ' ( ) * + , ; =。这些字符在作为参数值使用时必须编码,但在其结构位置上不应编码。
非保留字符(Unreserved Characters)
URL 中不需要编码的字符,包括 A-Z、a-z、0-9、-、_、.、~(RFC 3986)。这些字符在任何位置都可以直接使用。
Query String(查询字符串)
URL 中 ? 后面的部分,由 key=value 对组成,用 & 分隔。例如 ?name=张三&age=20 中 name=张三 和 age=20 是两个参数。
URLSearchParams
现代浏览器提供的 API,用于方便地构建和解析 URL 查询字符串,自动处理编码和解码。比手动拼接字符串更安全可靠。
application/x-www-form-urlencoded
HTML 表单默认的提交格式,空格编码为 + 而非 %20,与 encodeURIComponent 略有不同。服务器端框架通常能自动处理这两种格式。
UTF-8 编码
Web 标准字符编码。URL 编码中,非 ASCII 字符(如中文、emoji)先按 UTF-8 转为字节序列,再将每个字节编码为 %XX 格式。

四种编码模式字符转义对比

字符含义encodeURIComponentencodeURIRFC 3986
空格空格%20%20%20
!感叹号%21!%21
#片段标识符%23#%23
$美元符号%24$%24
&参数分隔符%26&%26
'单引号%27'%27
(左括号%28(%28
)右括号%29)%29
*星号%2A*%2A
+加号%2B+%2B
,逗号%2C,%2C
/路径分隔符%2F/%2F
:冒号%3A:%3A
;分号%3B;%3B
=等号%3D=%3D
?查询字符串%3F?%3F
@at符号%40@%40
~波浪号%7E%7E~

常见 URL 保留字符速查

编码后原始字符URL 中的用途
%20(空格)空格
%21!子分隔符
%23#片段标识符(hash)
%25%编码转义符本身
%26&查询参数分隔符
%2B+加号/表单空格
%2F/路径分隔符
%3A:协议分隔符
%3D=参数键值分隔符
%3F?查询字符串起始
%40@认证/邮箱分隔符
%5B[数组参数(RFC 3986)

Code Examples

JavaScript 中的 URL 编码/解码

// encodeURIComponent:编码单个参数值(最常用)
const param = encodeURIComponent('张三&李四');
console.log(param); // %E5%BC%A0%E4%B8%89%26%E6%9D%8E%E5%9B%9B

// encodeURI:编码完整URL(保留 :/?#&= 等结构字符)
const url = encodeURI('https://example.com/search?q=你好 世界');
console.log(url);

// 解码
const decoded = decodeURIComponent(param);
console.log(decoded); // 张三&李四

// RFC 3986 兼容(~ 不编码)
function rfc3986Encode(str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase());
}

// URLSearchParams API(现代方式,自动处理编码)
const params = new URLSearchParams({ name: '张三', city: '北京' });
console.log(params.toString());
// name=%E5%BC%A0%E4%B8%89&city=%E5%8C%97%E4%BA%AC

Python 中的 URL 编码/解码

from urllib.parse import quote, unquote, urlencode, quote_plus

# quote: 类似 encodeURIComponent
encoded = quote('张三&李四')
print(encoded)  # %E5%BC%A0%E4%B8%89%26%E6%9D%8E%E5%9B%9B

# RFC 3986 模式(~ 不编码,默认就是)
print(quote('hello~world'))  # hello~world

# quote_plus: 空格编码为 + 而非 %20(表单格式)
print(quote_plus('hello world'))  # hello+world

# 解码
print(unquote(encoded))  # 张三&李四

# urlencode: 构建查询字符串
params = urlencode({'name': '张三', 'city': '北京'})
print(params)
# name=%E5%BC%A0%E4%B8%89&city=%E5%8C%97%E4%BA%AC

Java 中的 URL 编码/解码

import java.net.URLEncoder;
import java.net.URLDecoder;
import java.net.URI;
import java.nio.charset.StandardCharsets;

public class URLEncodeExample {
    public static void main(String[] args) throws Exception {
        // URL编码(URLEncoder 是表单格式,空格变+)
        String encoded = URLEncoder.encode("张三&李四", "UTF-8");
        System.out.println(encoded);
        // %E5%BC%A0%E4%B8%89%26%E6%9D%8E%E5%9B%9B

        // 解码
        String decoded = URLDecoder.decode(encoded, "UTF-8");
        System.out.println(decoded); // 张三&李四

        // 构建完整URL(URI类自动处理编码)
        URI uri = new URI("https", "example.com", "/search", "q=你好世界", null);
        System.out.println(uri.toASCIIString());
    }
}

Authoritative References