有趣的问题。我刚刚运行了一些代码来测试这个:
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);
}
}
console.log(sb.join(' '));
结果:
! ' ( ) * - . _ ~
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);
}
}
console.log(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) {}
结果:
! ' ( ) * - . _ ~