gpt4 book ai didi

javascript - 为什么decodeURI 解码的字符比应有的多?

转载 作者:行者123 更新时间:2023-11-28 04:46:57 25 4
gpt4 key购买 nike

我刚刚阅读了有关 decodeURI ( MDNES6 spec )的内容,有些东西引起了我的注意:

Escape sequences that could not have been introduced by encodeURI are not replaced.

因此,它应该只解码 encodeURI 编码的字符。

// None of these should be escaped by `encodeURI`.
const unescaped = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'();/?:@&=+$,#";

const data = [...unescaped].map(char => ({
"char": char,
"encodeURI(char)": encodeURI(char),
"encodePercent(char)": encodePercent(char),
"decodeURI(encodePercent(char))": decodeURI(encodePercent(char))
}));

console.table( data );
console.log( "Check the browser's console." );

function encodePercent(string) {
return string.replace(/./g, char => "%" + char.charCodeAt(0).toString(16));
}

为什么这只适用于;/? : @ & = + $ , #?

最佳答案

该规范规定了以下步骤:

  1. Let unescapedURISet be a String containing one instance of each code unit valid in uriReserved and uriUnescaped plus "#"

我们来看看uriReserved ,瞧:

uriReserved ::: one of

; / ? : @ & = + $ ,

接下来的步骤是:

  1. Return Encode(uriString, unescapedURISet).

EncodeunescapedURISet 中的字符(包括 )之外的所有内容都对字符串进行编码;/? :@&=+$,

这意味着 encodeURI 永远无法为 uriReserveduriUnescaped 中的任何内容引入转义序列。

有趣的是,decodeURI 的定义如下:

  1. Let reservedURISet be a String containing one instance of each code unit valid in uriReserved plus "#".

  2. Return Decode(uriString, reservedURISet).

Decode工作原理与编码类似,并解码除 reservedURISet 中的字符之外的所有内容。显然,只有 uriReserved 的字符被排除在解码之外。这些恰好是 ;/? :@&=+$,!

问题仍然是为什么该标准指定了这一点。如果他们将 uriUnescaped 包含在 reservedURISet 中,则行为将与简介中所述完全一致。可能是一个错误?

关于javascript - 为什么decodeURI 解码的字符比应有的多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com