JavaScript:哪些字符不被encodeURIComponent编码?

6

我正在用一种不同的语言编写自己的函数,如果可能的话,希望它能提供相同的结果。


3
现在显而易见的问题是:为什么不能直接使用encodeURIComponent呢? - Felix Kling
“我正在编写一个函数,它需要像本地函数一样完全相同的行为”,确实引发了这个问题... - Andy E
@Felix:我写的不是JavaScript,而是Java和Perl。我想要独立的子程序,这样就不需要任何库就可以工作。我还想确保它与JavaScript等效。 - 700 Software
2个回答

9
您可以在MDC文档中找到信息:

encodeURIComponent对以下字符进行编码:
字母、数字、- _ . ! ~ * ' ( )


那不正确,冒号 : 被编码为 %3A - inta
@inta:引用中说“除了”以下字符。:不在例外列表中,因此是的,它会被转义。 - Felix Kling
@FelixKling 没错,你的回答是正确的。我的评论是针对Guilherme Ferreira的,也许我应该更明确地表达。 - inta

5

简而言之,您可以匹配所有UTF-16码元encodeURIComponent会使用以下编码:

/[^a-zA-Z0-9\-_.!~*'()]/g

虽然规范表示它可以处理采用4字节UTF-8编码的补充代码点。

长篇回答,ES 262 规定如下

15.1.3.4 encodeURIComponent(uriComponent)

encodeURIComponent 函数计算出一个新的 URI 版本,在该版本中,将某些字符的每个实例替换为一个、两个、三个或四个转义序列,这些序列代表字符的 UTF-8 编码。 当使用一个参数 uriComponent 调用 encodeURIComponent 函数时,执行以下步骤:

  1. 让 componentString 成为 ToString(uriComponent)。

  2. 让 unescapedURIComponentSet 成为包含在 uriUnescaped 中每个字符有效的字符串。

  3. 返回调用 Encode(componentString,unescapedURIComponentSet)的结果

而 uriUnescaped 的定义如下

uriUnescaped ::: uriAlpha | DecimalDigit | uriMark

其中

uriAlpha ::: a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 中的任意一个

uriMark ::: - _ . ! ~ * ' ( ) 中的任意一个

DecimalDigit ::: 0 1 2 3 4 5 6 7 8 9 中的任意一个


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接