我试图澄清Java的URLEncoder.encode()
,Javascript的encodeURI()
,encodeURIComponent()
和Android的Uri.encode()
之间的区别。
看起来像这样:
URLEncoder.encode()
编码,其他人保持encodeURI()
保留,其他人编码+
代表URLEncoder.encode()
,%20
代表似乎URLEncoder.encode()
和encodeURIComponent()
的行为相同。我是否正确,或者实际上他们也有一些区别?
答案 0 :(得分:5)
有趣的问题。我刚刚运行了一些代码来测试它:
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(' '));
<强>结果:强>
! # $ & ' ( ) * + , - . / : ; = ? @ _ ~
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(' '));
<强>结果:强>
! ' ( ) * - . _ ~
使用特定的编码方案将字符串转换为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){}
}
<强>结果:强>
请注意,+实际上是一个空格。
+ * - . _
将给定字符串中的字符编码为'%' - 使用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){}
<强>结果:强>
! ' ( ) * - . _ ~