encodeURI 用于编码完整 URL,保留 :、/、?、= 等合法字符,仅转义中文、空格等;encodeURIComponent 则严格编码所有特殊字符,适用于单个参数值。

encodeURI 用于编码整个 URL 字符串,保留协议、主机、路径分隔符等合法 URL 字符(如 :、/、?、=、&),只对真正需要转义的字符(比如中文、空格、# 后的片段标识符等)做编码;decodeURI 是它的逆操作,只解码由 encodeURI 编码的部分,不碰原本就合法的 URL 结构。
什么时候该用 encodeURI 而不是 encodeURIComponent
当你处理的是一个完整的 URL 地址(比如 "https://example.com/搜索?q=前端开发"),需要用 encodeURI。它会把中文路径和查询值编码,但保留 https://、/、?、= 等关键符号不被破坏:
-
encodeURI("https://例.com/你好?name=张三")→"https://%E4%BE%8B.com/%E4%BD%A0%E5%A5%BD?name=%E5%BC%A0%E4%B8%89" - 若错误使用
encodeURIComponent,会把:、/、?全部编码,导致 URL 失效
decodeURI 只负责“还原”,不修复非法结构
decodeURI 假设输入是合法的、由 encodeURI 生成的字符串。它不会校验或修正 URL 格式:
-
decodeURI("https://example.com/%E4%BD%A0%E5%A5%BD")→"https://example.com/你好" - 如果传入已损坏的编码(如残缺的 UTF-8 字节序列),可能抛出 URIError
- 它不会解码
%20以外的空格变体(如+),因为+不是encodeURI产生的
参数和查询值要用 encodeURIComponent / decodeURIComponent
URL 的某个具体参数值(比如 q=xxx 中的 xxx)必须用更严格的 encodeURIComponent,因为它连 /、?、=、& 都会编码,避免破坏 URL 结构:
立即学习“Java免费学习笔记(深入)”;
-
"q=" + encodeURIComponent("a/b?c=d")→"q=a%2Fb%3Fc%3Dd" - 对应解码必须用
decodeURIComponent,不能用decodeURI -
decodeURI("q=a%2Fb%3Fc%3Dd")不会解码%2F,结果还是"q=a/b?c=d"—— 看似正常,但这是巧合,不可依赖
常见误区与建议
- 不要对整个 URL 调用
encodeURIComponent,否则协议头失效 - 不要对单个参数值调用
encodeURI,它不编码&或=,可能导致参数解析错乱 - 从 URL 中提取 query string 后,应先用
split('&')和split('=')拆解,再对 value 部分用decodeURIComponent - 现代开发中推荐用
URLSearchParams(如new URLSearchParams(url).get('q')),它自动处理编码/解码逻辑,更安全










