JavaScript:哪些字符不是由encodeURIComponent编码的?

JavaScript:哪些字符不是由encodeURIComponent编码的?,javascript,url,encode,Javascript,Url,Encode,我正在用另一种语言编写我自己的函数,如果可能的话,我希望它能提供相同的结果。您可以在以下内容中找到信息: encodeURIComponent转义除以下字符外的所有字符: 字母,十进制数字,-。!~*'() 简短回答,您可以匹配所有UTF-16代码单元encodeURIComponent将使用以下代码进行编码: /[^a-zA-Z0-9\-_.!~*'()]/g 尽管如此,该规范说它使用4字节UTF-8编码处理补充代码点 答案很长,ES 262说 15.1.3.4编码组件(URI组件) enc

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

您可以在以下内容中找到信息:

encodeURIComponent
转义除以下字符外的所有字符:
字母,十进制数字,
-。!~*'()


简短回答,您可以匹配所有UTF-16代码单元
encodeURIComponent
将使用以下代码进行编码:

/[^a-zA-Z0-9\-_.!~*'()]/g
尽管如此,该规范说它使用4字节UTF-8编码处理补充代码点

答案很长,ES 262说

15.1.3.4编码组件(URI组件)

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

  • 让componentString为ToString(uriComponent)

  • 让unescapedURIComponentSet成为一个字符串,其中包含在中有效的每个字符的一个实例 uriUnescaped

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

  • UriunScaped就是这样定义的

    uriUnescaped:::uriAlpha |小数位数| uriMark

    在哪里

    uriAlpha::一个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 i j k l m n o p q r t u w x y z

    uriMark:::其中一个-!!~*'()

    小数位数:::0 1 2 3 4 5 6 7 8 9中的一个


    现在一个明显的问题是:为什么不能使用
    encodeURIComponent
    本身呢?“我正在编写一个函数,它的行为必须与本机函数完全相同”,这就引出了一个问题…@Felix:我写的不是JavaScript。它适用于Java和Perl。我需要独立的子例程,这样就可以在不需要任何库的情况下工作。我还想确保它与JavaScript等价物相同。好的,现在有意义了:)感谢您的澄清。这是不正确的,冒号
    被编码为
    %3A
    @inta:quote说除了以下字符<代码>:不在例外列表中,所以是的,它被转义。@FelixKling是的,你的回答是正确的,我的评论是写给Guilherme Ferreira的,也许我应该说得更清楚些。