URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的相互转换。
https://www.baidu.com/s?ie=UTF-8&wd=%E4%BD%A0%E5%A5%BD
当URL地址里包含非西欧字符的字符串时,系统会将这些非西欧字符串转换成看似乱码的特殊字符串。编程过程中可能涉及普通字符串和这种特殊字符串的相关转换,这就需要使用URLDecoder和URLEncoder类。
➢ URLDecoder类包含一个decode(String s, String enc)静态方法,它可以将看上去是乱码的特殊字符串转换成普通字符串。
➢ URLEncoder类包含一个encode(String s, String enc)静态方法,它可以将普通字符串转换成application/x-www-form-urlencoded MIME字符串。
参数解释:
s - 要转换(/被转换)的String。
enc – 支持的字符编码(/解码)的名称。
对字符串进行编码时,适用以下规则:
- 字母数字字符“ a ”到“ z ”、“ A ”到“ Z ”和“ 0 ”到“ 9 ”保持不变。
- 特殊字符“ . ”、“ - ”、“ * ”和“ _ ”保持不变。
- 空格字符“”被转换为加号“ + ”。
- 所有其他字符都是不安全的,首先使用某种编码方案将其转换为一个或多个字节。 然后每个字节由 3 个字符的字符串“ %xy ”表示,其中xy是字节的两位十六进制表示。 推荐使用的编码方案是 UTF-8。 但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。
例如:
使用 UTF-8 作为编码方案,
字符串“The string ü@foo-bar”
将被转换为
“The+string+%C3%BC%40foo-bar”,
因为在 UTF-8 中,字符 ü 被编码为两个字节 C3(十六进制)和 BC(十六进制),字符 @ 被编码为一个字节 40(十六进制)。
提示:
仅包含西欧字符的普通字符串和application/x-www-form-urlencoded MIME字符串无须转换,而包含中文字符的普通字符串则需要转换,转换方法是每个中文字符占两个字节,每个字节可以转换成两个十六进制的数字,所以每个中文字符将转换成“%XX%XX”的形式。当然,采用不同的字符集时,每个中文字符对应的字节数并不完全相同,所以使用URLEncoder和URLDecoder进行转换时也需要指定字符集。
测试:
try {
//你好
System.out.println(URLDecoder.decode("%E4%BD%A0%E5%A5%BD", "utf-8"));
//%E4%BD%A0%E5%A5%BD
System.out.println(URLEncoder.encode("你好", "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}