在 JavaScript 中,有几个内置函数可以用于 URL 编码和解码:

编码函数

  1. encodeURI()

  • 对整个 URI 进行编码
  • 不会编码:A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
  • 用于编码整个 URL
const url = "https://example.com/测试路径?name=值&age=20";
console.log(encodeURI(url));
// 输出: "https://example.com/%E6%B5%8B%E8%AF%95%E8%B7%AF%E5%BE%84?name=%E5%80%BC&age=20"
  1. encodeURIComponent()

  • 对 URI 的组件部分进行编码

  • 不会编码:A-Z a-z 0-9 - _ . ! ~ * ' ( )

  • 用于编码查询参数等部分

const param = "测试值";
console.log(encodeURIComponent(param));
// 输出: "%E6%B5%8B%E8%AF%95%E5%80%BC"

解码函数

  1. decodeURI()

  • 解码由 encodeURI() 编码的 URI
const encodedUrl = "https://example.com/%E6%B5%8B%E8%AF%95";
console.log(decodeURI(encodedUrl));
// 输出: "https://example.com/测试"
  1.  decodeURIComponent()
  • 解码由 encodeURIComponent() 编码的 URI 组件
const encodedParam = "%E6%B5%8B%E8%AF%95";
console.log(decodeURIComponent(encodedParam));
// 输出: "测试"

注意事项

  • 不推荐使用已废弃的 escape() 和 unescape() 函数

  • 对于表单数据,通常使用 application/x-www-form-urlencoded 格式,可以使用 URLSearchParams API 来处理:
const params = new URLSearchParams();
params.append('name', '测试');
params.append('age', '20');
console.log(params.toString());
// 输出: "name=%E6%B5%8B%E8%AF%95&age=20"
  • 在现代浏览器中,也可以使用 URL 对象来处理 URL:
const url = new URL('https://example.com');
url.searchParams.set('name', '测试');
console.log(url.href);
// 输出: "https://example.com/?name=%E6%B5%8B%E8%AF%95"