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

时间:2015-07-20 08:30:19

标签: javascript java android encoding

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

看起来像这样:

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

似乎URLEncoder.encode()encodeURIComponent()的行为相同。我是否正确,或者实际上他们也有一些区别?

1 个答案:

答案 0 :(得分: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(' '));

<强>结果:

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

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(' '));

<强>结果:

! ' ( ) * - . _ ~

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){}
}

<强>结果:

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

+ * - . _

Android Uri.encode

  

将给定字符串中的字符编码为'%' - 使用UTF-8方案转义八位字节。保留字母(“A-Z”,“a-z”),数字(“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){}

<强>结果:

! ' ( ) * - . _ ~