URL转码方法及不能被转码的特殊字符(java)

URL编码表一览

 

æ







退格
TAB
换行


回车


















空格
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
%00
%01
%02
%03
%04
%05
%06
%07
%08
%09
%0a
%0b
%0c
%0d
%0e
%0f
%10
%11
%12
%13
%14
%15
%16
%17
%18
%19
%1a
%1b
%1c
%1d
%1e
%1f
%20
%21
%22
%23
%24
%25
%26
%27
%28
%29
%2a
%2b
%2c
%2d
%2e
%2f
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
%30
%31
%32
%33
%34
%35
%36
%37
%38
%39
%3a
%3b
%3c
%3d
%3e
%3f
%40
%41
%42
%43
%44
%45
%46
%47
%48
%49
%4a
%4b
%4c
%4d
%4e
%4f
%50
%51
%52
%53
%54
%55
%56
%57
%58
%59
%5a
%5b
%5c
%5d
%5e
%5f
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~




ƒ




ˆ

Š

Œ

丒br>
%60
%61
%62
%63
%64
%65
%66
%67
%68
%69
%6a
%6b
%6c
%6d
%6e
%6f
%70
%71
%72
%73
%74
%75
%76
%77
%78
%79
%7a
%7b
%7c
%7d
%7e
%7f
%80
%81
%82
%83
%84
%85
%86
%87
%88
%89
%8a
%8b
%8c
%8d
%8e
%8f








˜

š

œ

丒br>Ÿ

¡
¢
£

\
|


©
ª
«
¬
¯
®
¯


²
³

µ

·
¸
¹
º
»
¼
½
¾
¿
%90
%91
%92
%93
%94
%95
%96
%97
%98
%99
%9a
%9b
%9c
%9d
%9e
%9f
%a0
%a1
%a2
%a3
%a4
%a5
%a6
%a7
%a8
%a9
%aa
%ab
%ac
%ad
%ae
%af
%b0
%b1
%b2
%b3
%b4
%b5
%b6
%b7
%b8
%b9
%ba
%bb
%bc
%bd
%be
%bf
À
Á
Â
Ã
Ä
Å
Æ
Ç
È
É
Ê
Ë
Ì
Í
Î
Ï
Ð
Ñ
Ò
Ó
Ô
Õ
Ö

Ø
Ù
Ú
Û
Ü
Ý
Þ
ß
à
á
â
ã
ä
å
æ
ç
è
é
ê
ë
ì
í
î
ï
%c0
%c1
%c2
%c3
%c4
%c5
%c6
%c7
%c8
%c9
%ca
%cb
%cc
%cd
%ce
%cf
%d0
%d1
%d2
%d3
%d4
%d5
%d6
%d7
%d8
%d9
%da
%db
%dc
%dd
%de
%df
%e0
%e1
%e2
%e3
%e4
%e5
%e6
%e7
%e8
%e9
%ea
%eb
%ec
%ed
%ee
%ef
ð
ñ
ò
ó
ô
õ
ö

ø
ù
ú
û
ü
ý
þ
ÿ
 
%f0
%f1
%f2
%f3
%f4
%f5
%f6
%f7
%f8
%f9
%fa
%fb
%fc
%fd
%fe

 

 

  以下8个特殊字符URL编码没有对其进行转码十六进制值
1.+URL 中+号表示空格%2B
2.空格URL中的空格可以用+号或者编码%20
3./分隔目录和子目录%2F
4.?分隔实际的 URL 和参数%3F
5.%指定特殊字符%25
6.#表示书签%23
7.&URL 中指定的参数间的分隔符%26
8.=URL 中指定参数的值%3D

 

URL转码方法 var str = encodeURI(str);(此方法为JavaScript的)

<SCRIPT LANGUAGE="JavaScript">
  <!--
 var str = "1一aA";
 alert(encodeURI(str)); 
  //-->
</SCRIPT>

备注:

python:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import hashlib
import collections
import urllib


def md5(ss):
    m = hashlib.md5()
    m.update(ss)
    return m.hexdigest()

params = collections.OrderedDict()
a = "test 1"
# a = a.replace(" ", "")  # 不去掉空格
params['reg'] = a
pstr = ''
for key, val in params.items():
    pstr += key + "=" + str(val)
print pstr
pstr = urllib.quote(pstr.encode('utf-8'))
print pstr
sign = md5(pstr)
print sign

输出:

reg=test 1
reg%3Dtest%201
ba22339e5c14a5ed05592474648983b2

java:

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;

public class Md5Util {
    private static MessageDigest md5 = null;
    static {
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * 用于获取一个String的md5值
     * 
     * @param string
     * @return
     */
    public static String getMd5(String str) {
        byte[] bs = md5.digest(str.getBytes());
        StringBuilder sb = new StringBuilder(40);
        for (byte x : bs) {
            if ((x & 0xff) >> 4 == 0) {
                sb.append("0").append(Integer.toHexString(x & 0xff));
            } else {
                sb.append(Integer.toHexString(x & 0xff));
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        StringBuilder sb = new StringBuilder();
        String a = "test 1";
//        a = a.replace(" ", "");  // 不去掉空格
        sb.append("reg=").append(a);
        System.out.println(sb);
        String encoded = URLEncoder.encode(sb.toString(), "UTF-8");
        System.out.println(encoded);
        String md5Sign = getMd5(encoded);
        System.out.println(md5Sign);

    }
}

输出:

reg=test 1
reg%3Dtest+1
9c4ba428cc77a7aa00bbcffab108823d
 

url里面URL编码没有对空格其进行转码,所有造成了请求的参数不一致,md5更加不一致。

解决办法:

1.replace去掉空格(把注释去掉),或者替换为别的字符。

输出为:

python:

reg=test1
reg%3Dtest1
5320493f76fe3c392b8d7b2866da1948

java:

reg=test1
reg%3Dtest1
5320493f76fe3c392b8d7b2866da1948

字符正常了。所以用url传输数据时候,需要把那8个+空格/?%#&=在python和java中replace替换掉,以保证encode一致,如果需要MD5的sign验证的,需要注意这几个字符。

python

转载于:https://my.oschina.net/yves175/blog/828600

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值