17.2.2 使用URLDecoder和URLEncoder

17.2.2 使用URLDecoder和URLEncoder

URLDecoderURLEncoder用于完成普通字符串和application/x-www-Form-urlencoded MIME字符串之间的相互转换。可能有读者觉得后一个字符串非常专业,以为又是什么特别高深的知识

当地址栏中的关键字包含中文时,这些关键字就会变成”乱码”
例如,在搜索引擎中搜索中秋节这三个中文关键字:
我们在地址栏中看到的是:

1
https://www.baidu.com/s?wd=中秋节

但是如果你复制这个地址,就会得到如图下所示的“乱码”:

1
https://www.baidu.com/s?wd=%E4%B8%AD%E7%A7%8B%E8%8A%82

实际上这不是乱码,这就是所谓的application/x-www-form-urlencoded MIME字符串。

URL地址里包含非西欧字符的字符串时,系统会将这些非西欧字符串转换成类似上面的特殊字符串。编程过程中可能涉及普通字符串和这种特殊字符串的相关转换,这就需要使用URLDecoderURLEncoder类。

  • URLDecoder类包含一个decode(String s, String enc)静态方法,它可以将看上去是乱码的application/x-www-form-urlencode MIME字符串转换成普通字符串。
  • URLEncoder类包含一个encode(String s, String enc)静态方法,它可以将普通字符串转换成application/x-www-form-urlencode MIME字符串。

URLDecoder decode方法

方法 描述
static String decode(String s) Deprecated. The resulting string may vary depending on the platform’s default encoding.
static String decode(String s, String enc) Decodes an application/x-www-form-urlencoded string using a specific encoding scheme.
static String decode(String s, Charset charset) Decodes an application/x-www-form-urlencoded string using a specific Charset.

URLEncoder encode方法

方法 描述
static String encode(String s) Deprecated. The resulting string may vary depending on the platform’s default encoding.
static String encode(String s, String enc) Translates a string into application/x-www-form-urlencoded format using a specific encoding scheme.
static String encode(String s, Charset charset) Translates a string into application/x-www-form-urlencoded format using a specific Charset.

程序示例 MIME字符串和普通字符串的相互转换

下面程序示范了如何将上面的地址栏中的“乱码”转换成普通字符串,并示范了如何将普通字符串转换成application/x-www-fom-urlencode MIME字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.net.*;

public class URLDecoderTest {
public static void main(String[] args) throws Exception {
// 将application/x-www-form-urlencoded字符串转换成普通字符串
String mimeStr = "%E4%B8%AD%E7%A7%8B%E8%8A%82";
String decodeStr = URLDecoder.decode(mimeStr, "utf-8");
System.out.println("解码后得到:" + decodeStr);

// 将普通字符串转换成application/x-www-form-urlencoded字符串
String encodeStr = URLEncoder.encode("中秋节", "UTF-8");
System.out.println("编码后得到:" + encodeStr);
System.out.println(encodeStr.equals(mimeStr));
}
}

上面程序用于完成普通字符串和application/x-www-Form-urlencoded MIME字符串之间的转换。运行上面程序,将看到如下输出:

1
2
3
解码后得到:中秋节
编码后得到:%E4%B8%AD%E7%A7%8B%E8%8A%82
true

哪些字符串需要转换

只有包含西欧字符的普通字符串和application/x-www-fom-urlencode MIME字符串无须转换,而包含中文字符的普通字符串则需要转换,转换方法是每个中文字符占两个字节,每个字节可以转换成两个十六进制的数字,所以每个中文字符将转换成“%XX%XX”的形式。当然,采用不同的字符集时,毎个中文字符对应的字节数并不完全相同,所以使用URLEncoderURLDecoder进行转换时也需要指定字符集。