python通过url下载文件不可读_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的)

备注:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值