URL 编码
# 21.URL编码
URL 编码是浏览器发送数据给服务器时使用的编码,它通常附加在 URL 的参数部分。
# 为什么需要 URL 编码
举个例子,我们在百度里搜索“中文”这两个字,其发送给后台服务器的网址类似这样的:https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87 (opens new window)
我们可以打开浏览器控制台查看:
这些字符串是怎么来的呢?是通过 URL 编码的方式得出的。以前很多服务器只识别 ASCII 字符。但如果 URL 中包含中文、日文这些非 ASCII 字符怎么办?就得 URL 编码规则来转换了:
- 如果字符是
A ~ Z
,a ~z
,0 ~ 9
以及-
、_
、.
、*
,则保持不变 - 如果是其他字符,先转换为 UTF-8 编码,然后对每个字节以
%XX
表示 - URL 编码总是大写
例如:字符 中
的 UTF-8 编码是 0xe4b8ad
,因此,它的 URL 编码是 %E4%B8%AD
。
# URLEncoder
很多语言都提供了对 URL 进行编码的工具类。例如在 Java 中,提供了 URLEncoder 来对字符进行编码,我们来试试对“中文!” 这个词进行编码:
import java.net.URLEncoder;
public class TestURL{
public static void main(String[] args) throws Exception{
String encoded = URLEncoder.encode("中文!", "UTF-8");
System.out.println(encoded);
}
}
2
3
4
5
6
7
8
9
上述代码的运行结果是 %E4%B8%AD%E6%96%87%21
,中
的 URL 编码是 %E4%B8%AD
,文
的 URL 编码是 %E6%96%87
,!
虽然是 ASCII 字符(这里用更多是半角符号),也要对其编码为 %21
。
和标准的 URL 编码稍有不同,URLEncoder 把空格字符编码成 +
,而现在的 URL 编码标准要求空格被编码为 %20
,不过,服务器都可以处理这两种情况。
# URLDecoder
如果服务器收到 URL 编码的字符串,就可以对其进行解码,还原成原始字符串。Java 标准库的 URLDecoder
就可以解码:
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
public class TestURL {
public static void main(String[] args) {
String decoded = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", StandardCharsets.UTF_8);
System.out.println(decoded);
}
}
2
3
4
5
6
7
8
# 完整代码
import java.net.URLDecoder;
import java.net.URLEncoder;
public class TestURL {
public static void main(String[] args) throws Exception{
String encoded = URLEncoder.encode("中文!", "UTF-8");
System.out.println(encoded); //%E4%B8%AD%E6%96%87%21
String decoString = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", "UTF-8");
System.out.println(decoString); //中文
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# 小结
URL 编码的目的是把任意文本数据编码为 %
前缀表示的文本,编码后的文本仅包含 A ~ Z
,a ~ z
,0 ~ 9
,-
,_
,.
,*
和 %
,便于浏览器和服务器处理。