开发与接口

网址参数有空格和中文时怎么编码?

给搜索链接或接口查询参数编码时,只处理参数值,不要把整条网址和分隔符一起编码,并用解码结果检查中文、空格与特殊符号。

撰文: 3sec 编辑部 资料核对日期: 4 分钟阅读 1526 字

先分清楚参数名、参数值和整条网址

网址参数有中文、空格或 & 时,通常只编码每个参数值,再保留 ?、= 和 & 组成查询结构。把完整网址一次性编码,会连协议和分隔符一起变成 %3A、%2F、%3F、%3D 与 %26,结果不能直接当普通链接打开。

例如搜索地址的结构是 https://example.com/search?q=参数值&sort=参数值。关键词 夏季 鞋 应先单独编码,再接到 q= 后面;排序值也要单独处理。不要把 q=夏季 鞋&sort=价格 整段当成一个参数值,否则中间的 = 和 & 会失去原本的分隔作用。

只有一种常见例外:某个参数的值本身就是另一条完整网址。比如回调参数 redirect= 后面要放 https://example.com/result?id=8,这时可以把内层网址整体当作一个值编码,外层网址的 redirect= 仍保持不变。到底需要哪种形式,要以接收接口、表单或框架的文档为准。

用 URL 编解码工具只处理一个值

把单个参数值贴进 URL 编解码工具的“编码”页签,再复制输出。当前页面调用浏览器的 JavaScript encodeURIComponent,也就是把整段输入当作一个 URI component,而不是自动识别主机名、路径和多个参数。

例如输入 夏季 鞋,输出是 %E5%A4%8F%E5%AD%A3%20%E9%9E%8B;空格在这里变成 %20。输入 红色&蓝色 时,中间的 & 会变成 %26,这样它留在同一个参数值里,不会被误认成下一个参数的开始。WHATWG URL 标准把百分号后接两位十六进制数字定义为 percent-encoded byte,ECMAScript 则规定了 encodeURIComponent 的编码步骤。

工具的行为也说明了边界:它不会替你拼接查询参数,不会检查接口字段名,不会判断服务器是否希望空格写成 +,更不会自动避免重复编码。它只是把输入编码或解码,并提供复制结果。

避免整条编码、重复编码和加号误判

编码失败往往不是字符本身有问题,而是处理范围错了。先保留一份未编码的原始值,再检查下列三种情况,就能避免大多数搜索链接和 API 参数错误。

  • 整条网址被编码:若输出开头是 https%3A%2F%2F,说明协议和斜线也被处理了。只有当整条网址本来就是另一个参数值时才可能正确。
  • 同一个值编码两次:第一次输出中的 % 会在第二次变成 %25。例如 %E5 再编码会以 %25E5 开头,服务器解码一次后仍会留下百分号序列。
  • 把 + 一律当空格:encodeURIComponent 会把普通空格写成 %20。某些 HTML 表单使用 application/x-www-form-urlencoded,可能把空格序列化成 +;不要在不知道接收规则时手动互换。

例如接口返回“签名不匹配”,先比对它要求签名的是原始值、编码后的值,还是按字段排序后的完整查询串。不要靠反复编码碰运气,因为多一个 %25、少一个斜线或参数顺序变化,都可能让签名输入不同。

用解码和实际请求做两次核对

编码后先切到“解码”页签,把刚才的结果还原。还原内容应和原始参数值逐字一致,包括空格、斜线、中文和 &。如果解码时报错,常见原因是孤立的 %、后面不足两位十六进制数字,或复制时截断了序列;回到原始值重新编码,不要手动猜缺少的字符。

接着把编码值接回测试网址,只在测试环境或无敏感信息的请求中验证。检查浏览器地址栏或开发工具里的实际请求,确认参数数量、字段名和值都符合预期。编码不是加密,也不会让恶意网址变安全;完整 URL 还可能进入浏览历史、服务器日志、分析系统或分享记录,因此密码、令牌和个人资料不应因为“看起来像乱码”就放进查询参数。

如果接口明确要求 JSON 请求体,不要先把整段 JSON 塞进查询参数。可以用 JSON 格式化与验证工具检查一份不含敏感信息的 JSON 样本,再按接口文档发送;它不会把 JSON 自动改成 URL 参数。Base64 也不是 URL 编码,不能替代接收端规定的 percent-encoding。

常见问题

中文参数为什么会变成很多百分号?

非 ASCII 字符会先按 UTF-8 表示,再写成多个 % 加两位十六进制数字的序列。一个汉字通常对应多组字节,因此输出会比原文长;解码后应恢复成同一个字符。

我应该编码整条网址还是只编码参数值?

普通搜索链接和接口查询通常只编码每个参数值,并保留 ?、= 与 &。只有当整条网址本身是回调、跳转等参数的值时,才把那条内层网址整体编码。

空格写成 %20 还是加号才对?

这个工具使用 encodeURIComponent,空格输出为 %20。部分表单序列化规则使用 +,所以最终写法要看接收系统采用的格式,不能只凭肉眼替换。

为什么解码时显示错误?

输入可能包含不完整的百分号序列,例如只有 %E5%A4 的截断结果,或者普通 % 没有编码成 %25。请回到完整原始值重新编码,并检查复制过程。

URL 编码能隐藏密钥或防止钓鱼吗?

不能。任何人都能解码,网址也可能被记录。编码只解决字符在 URL 组件中的表示问题,不提供加密、权限控制或目的地信誉判断。

参考资料