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);
}
}
1
2
3
4
5
6
7
8
9
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);
}
}
1
2
3
4
5
6
7
8
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); //中文!
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 小结
URL编码的目的是把任意文本数据编码为%
前缀表示的文本,编码后的文本仅包含A
~Z
,a
~z
,0
~9
,-
,_
,.
,*
和%
,便于浏览器和服务器处理。
在GitHub上编辑此页 (opens new window)
上次更新: 2024/1/28 03:08:52