Android中的Uri.encode()是否等同于Javascript中的encodeURIComponent()?

Rom*_*'ai 2 javascript java encoding android

我试图澄清Java的区别URLEncoder.encode(),JavaScript的encodeURI()encodeURIComponent()和Android的Uri.encode()

看起来像这样:

  • 字母和数字
    • 每个人都保持
  • .- * _
    • 每个人都保持
  • !〜'()
    • URLEncoder.encode() 编码,其他保留
  • ,/?:@&= + $#
    • encodeURI() 保持,其他编码
  • 空间
    • +URLEncoder.encode()%20为他人

看起来URLEncoder.encode()encodeURIComponent()行为都一样。我是对的,还是实际上它们也有一些区别?

Yet*_*eti 5

有趣的问题。我只是运行了一些代码来对此进行测试:

Javascript encodeURI

encodeURI会转义所有字符,除了:

未逃脱: A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #

码:

var sb = [];
for(var i=0;i<256;++i)
{
    var encoded = encodeURI(String.fromCharCode(i));
    if(encoded.indexOf('%') !== 0 && !encoded.match(/^[a-zA-Z0-9]+$/))
    {
        sb.push(encoded);
    }
}
alert(sb.join(' '));
Run Code Online (Sandbox Code Playgroud)

结果:

! # $ & ' ( ) * + , - . / : ; = ? @ _ ~
Run Code Online (Sandbox Code Playgroud)

JavaScript的encodeURIComponent

encodeURIComponent会转义所有字符,除了:

未逃脱: A-Z a-z 0-9 - _ . ! ~ * ' ( )

码:

var sb = [];
for(var i=0;i<256;++i)
{
    var encoded = encodeURIComponent(String.fromCharCode(i));
    if(encoded.indexOf('%') !== 0 && !encoded.match(/^[a-zA-Z0-9]+$/))
    {
        sb.push(encoded);
    }
}
alert(sb.join(' '));
Run Code Online (Sandbox Code Playgroud)

结果:

! ' ( ) * - . _ ~
Run Code Online (Sandbox Code Playgroud)

Java URLEncoder.encode

使用特定的编码方案将字符串转换为application / x-www-form-urlencoded格式。此方法使用提供的编码方案来获取不安全字符的字节。

码:

public static void main(String[] args)
{
    try
    {
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<256;++i)
        {
            String encoded = URLEncoder.encode(String.valueOf((char) i), "UTF-8");
            if(!encoded.startsWith("%") && !encoded.matches("^[a-zA-Z0-9]+$"))
            {
                sb.append(' ').append(encoded);
            }
        }
        System.out.println(sb.substring(1));
    }
    catch(Exception e){}
}
Run Code Online (Sandbox Code Playgroud)

结果:

请注意,+实际上是一个空格。

+ * - . _
Run Code Online (Sandbox Code Playgroud)

Android Uri.encode

使用UTF-8方案将给定字符串中的字符编码为'%'转义的八位字节。保留字母(“ AZ”,“ az”),数字(“ 0-9”)和未保留的字符(“ _- !.〜'()*”)完整无缺。编码所有其他字符。

码:

try
{
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<256;++i)
    {
        String encoded = Uri.encode(String.valueOf((char) i));
        if(!encoded.startsWith("%") && !encoded.matches("^[a-zA-Z0-9]+$"))
        {
            sb.append(' ').append(encoded);
        }
    }
    System.out.println(sb.substring(1));
}
catch(Exception e){}
Run Code Online (Sandbox Code Playgroud)

结果:

! ' ( ) * - . _ ~
Run Code Online (Sandbox Code Playgroud)

  • 是的,我在答案中添加了文档。它们都对除某个列表之外的所有字符进行编码,这对两个函数来说都是等价的。 (2认同)