decodeURI()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

decodeURI() 函数用于解码之前由 encodeURI() 或类似例程创建的统一资源标识符 (URI)。

试一试

const uri = "https://mozilla.org/?x=шеллы";
const encoded = encodeURI(uri);
console.log(encoded);
// Expected output: "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"

try {
  console.log(decodeURI(encoded));
  // Expected output: "https://mozilla.org/?x=шеллы"
} catch (e) {
  // Catches a malformed URI
  console.error(e);
}

语法

js
decodeURI(encodedURI)

参数

encodedURI

一个完整的、已编码的统一资源标识符。

返回值

一个新字符串,表示给定已编码的统一资源标识符 (URI) 的未编码版本。

异常

URIError

如果 encodedURI 包含一个 % 后面没有跟着两个十六进制数字,或者如果转义序列没有编码一个有效的 UTF-8 字符,则抛出此错误。

描述

decodeURI() 是全局对象的一个函数属性。

decodeURI() 函数通过将形式为 %XX 的每个转义序列视为一个 UTF-8 代码单元(一个字节)来解码 URI。在 UTF-8 中,第一个字节中前导 1 位的数量(可以是 0(用于 1 字节 ASCII 字符)、2、3 或 4)表示字符中的字节数。因此,通过读取第一个转义序列,decodeURI() 可以确定还需要消耗多少个转义序列。如果 decodeURI() 未能找到预期的序列数量,或者如果转义序列没有编码有效的 UTF-8 字符,则会抛出 URIError

decodeURI() 会解码所有转义序列,但如果转义序列编码以下字符之一,则转义序列会保留在输出字符串中(因为它们是 URI 语法的一部分)

; / ? : @ & = + $ , #

示例

解码西里尔字母 URL

js
decodeURI(
  "https://mdn.org.cn/en-US/docs/JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B",
);
// "https://mdn.org.cn/en-US/docs/JavaScript_шеллы"

decodeURI() 与 decodeURIComponent()

decodeURI() 假定输入是一个完整的 URI,因此它不会解码属于 URI 语法的字符。

js
decodeURI(
  "https://mdn.org.cn/docs/JavaScript%3A%20a_scripting_language",
);
// "https://mdn.org.cn/docs/JavaScript%3A a_scripting_language"

decodeURIComponent(
  "https://mdn.org.cn/docs/JavaScript%3A%20a_scripting_language",
);
// "https://mdn.org.cn/docs/JavaScript: a_scripting_language"

捕获错误

js
try {
  const a = decodeURI("%E0%A4%A");
} catch (e) {
  console.error(e);
}

// URIError: malformed URI sequence

规范

规范
ECMAScript® 2026 语言规范
# sec-decodeuri-encodeduri

浏览器兼容性

另见