原理分析"/>
URL 编解码原理分析
为什么要URLEncode
URL在定义时,定义为只支持ASCII字符,所以URL的发送方与接收方都只能处理ASCII字符。所以当你的URL中有非ASCII字符时就需要编码转换。
在Web程序中进行URL请求时,常会遇到URL中含有特殊字符的问题,常见的特殊字符有 ?$&*@等字符,或者是中文。
遇到这种情况时,就要对URL进行编码,用一种规则替换掉这些特殊字符,这就是URLEncode
URLEncode 规则
1.将空格转换为加号(+)
2.对0-9、a-z、A-Z之间的字符保持不变
3.对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每一个字节前加上一个百分号(%),如字符“+”是用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中占两个字节,字符“中”用%D6%D0表示,字符“国”用%B9%FA表示。
4.空格也可以直接用其十六进制编码方式,即用%20表示,而不是将它转换为加号(+)。
下表为UTF-8的码表:
可以看到‘+’ 在UTF-8里是002B 所以URL encode之后就是%2B
/
一段示例代码:
//直接解码println(URLDecoder.decode("7BVz75MBX8HSm+PNo6yNlVyu1titpIrAMkYZ4A0mwzY=","UTF-8"))//解码println(URLDecoder.decode("7BVz75MBX8HSm%20PNo6yNlVyu1titpIrAMkYZ4A0mwzY%3D","UTF-8"))//先编码println(URLEncoder.encode("7BVz75MBX8HSm+PNo6yNlVyu1titpIrAMkYZ4A0mwzY=","UTF-8"))//后解码println(URLDecoder.decode("7BVz75MBX8HSm%2BPNo6yNlVyu1titpIrAMkYZ4A0mwzY%3D","UTF-8"))输出:7BVz75MBX8HSm PNo6yNlVyu1titpIrAMkYZ4A0mwzY=
7BVz75MBX8HSm PNo6yNlVyu1titpIrAMkYZ4A0mwzY=
7BVz75MBX8HSm%2BPNo6yNlVyu1titpIrAMkYZ4A0mwzY%3D
7BVz75MBX8HSm+PNo6yNlVyu1titpIrAMkYZ4A0mwzY=
我们看到对于“7BVz75MBX8HSm+PNo6yNlVyu1titpIrAMkYZ4A0mwzY=” 这个字符串
如果直接进行decode,里面的‘+’会被decode成空格,因为源码里是直接这么写的:
.base/share/classes/java/net/URLDecoder.java
public static String decode(String s, Charset charset) {Objects.requireNonNull(charset, "Charset");boolean needToChange = false;int numChars = s.length();StringBuilder sb = new StringBuilder(numChars > 500 ? numChars / 2 : numChars);int i = 0;char c;byte[] bytes = null;while (i < numChars) {c = s.charAt(i);switch (c) {case '+':sb.append(' ');i++;needToChange = true;break;case '%':......
我们可以看到,‘+’ 和 %20 都被转成了空格,他们在进行解码的时候,是等值的。
疑问:
很多平台都是有问题的,比如/url.html
m+P 字符串decode 还是源字符串
不会变成m P
不确定是不是没有适配JAVA?
更多推荐
URL 编解码原理分析
发布评论