首页 > 技术文章 > URL编码

xuehaoyue 2017-03-26 22:05 原文

一、"%编码"规范:( "%" 其后跟随两位的十六进制数,共256种)

1. ASCII字符ASCII 是7比特字符集,包含了128个不同的字符值。此处有127个,少了设备控制字符中的DEL

    • 非转义字符:不编码;

ASCII 字符

URL-编码

!

%21

'

%27

(

%28

)

%29

*

%2A

-

%2D

.

%2E

0

%30

1

%31

2

%32

3

%33

4

%34

5

%35

6

%36

7

%37

8

%38

9

%39

A

%41

B

%42

C

%43

D

%44

E

%45

F

%46

G

%47

H

%48

I

%49

J

%4A

K

%4B

L

%4C

M

%4D

N

%4E

O

%4F

P

%50

Q

%51

R

%52

S

%53

T

%54

U

%55

V

%56

W

%57

X

%58

Y

%59

Z

%5A

_

%5F

a

%61

b

%62

c

%63

d

%64

e

%65

f

%66

g

%67

h

%68

i

%69

j

%6A

k

%6B

l

%6C

m

%6D

n

%6E

o

%6F

p

%70

q

%71

r

%72

s

%73

t

%74

u

%75

v

%76

w

%77

x

%78

y

%79

z

%7A

~

%7E

   

    • 保留字符encodeURIComponent()编码,encodeURI()不编码

ASCII 字符

URL-编码

$

%24

&

%26

+

%2B

,

%2C

/

%2F

:

%3A

;

%3B

=

%3D

?

%3F

@

%40

 

        编码原因

 

        • 保留字具有特殊的含义。如"&"表示参数分隔符,"="表示参数keyvalue的连接
        • 如果 value 字符串本身包含了 = 或者 & ,如宝洁公司的简称为P&G,假设需要当做参数去传递,那么可能URL所带参数可能会是这样 ?name=P&G&t=1450591802326,因为参数中多了一个&势必会造成接收 URL 的服务器解析错误,因此必须将引起歧义的 & 和 = 符号进行转义, 也就是对其进行编码。
    • 数字符号encodeURIComponent()编码,encodeURI()不编码

ASCII 字符

URL-编码

#

%23

    • 其他字符:编码

ASCII 字符

URL-编码

space

%20

"

%22

%

%25

<

%3C

>

%3E

[

%5B

\

%5C

]

%5D

^

%5E

`

%60

{

%7B

|

%7C

}

%7D

ASCII 设备控制字符

描述

URL-编码

NUL

null character

%00

SOH

start of header

%01

STX

start of text

%02

ETX

end of text

%03

EOT

end of transmission

%04

ENQ

enquiry

%05

ACK

acknowledge

%06

BEL

bell (ring)

%07

BS

backspace

%08

HT

horizontal tab

%09

LF

line feed

%0A

VT

vertical tab

%0B

FF

form feed

%0C

CR

carriage return

%0D

SO

shift out

%0E

SI

shift in

%0F

DLE

data link escape

%10

DC1

device control 1

%11

DC2

device control 2

%12

DC3

device control 3

%13

DC4

device control 4

%14

NAK

negative acknowledge

%15

SYN

synchronize

%16

ETB

end transmission block

%17

CAN

cancel

%18

EM

end of medium

%19

SUB

substitute

%1A

ESC

escape

%1B

FS

file separator

%1C

GS

group separator

%1D

RS

record separator

%1E

US

unit separator

%1F

   

2. 非ASCII字符(129个):取其Unicode内码,然后加上"%"前缀将该字符进行编码

非ASCII 字符

URL-编码

  

%7F

`

%80



%81

%82

ƒ

%83

"

%84

%85

%86

%87

ˆ

%88

%89

Š

%8A

%8B

Œ

%8C



%8D

Ž

%8E



%8F



%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

ÿ

%FF

   

   

二、相关函数

1.  encodeURI()

  • 对一个完整的URI进行编码对除“非转义字符”、“保留字符”、“数字符号”以外的字符编码
    • 原因:URI是完整的URI,无需对那些保留的并且在URI中有特殊意思的字符进行编码。
    • encodeURI 自身无法产生能适用于HTTP GET 或 POST 请求的URI,例如对于 XMLHTTPRequests, 因为 "&", "+", 和 "=" 等保留字符不会被编码,然而在 GET 和 POST 请求中它们是特殊字符。此时,encodeURIComponent方法可以对这些字符编码。
  • 语法:
    • encodeURI(URI)
      • 参数URI:一个完整的URI
  • 例:

encodeURI("http://www.cnblogs.com/season-huang/some other thing");

//"http://www.cnblogs.com/season-huang/some%20other%20thing";

 

2. decodeURI()

  • 将已编码 URI 中所有能识别的转义序列转换成原字符,但不能解码那些不会被 encodeURI 编码的内容(例如 "#")
  • 语法:
    • decodeURI(encodedURI)
      • 参数encodedURI:一个完整的编码过的URI

3. encodeURIComponent()

  • 对URI的组成部分进行编码
  • 作用:对 URL 中的参数进行编码,而不是对整个 URL 进行编码
  • 对除“非转义字符”以外的字符编码(包括“保留字符”、“数字符号”)
  • 语法:
    • encodeURIComponent(str)
      • 参数str:字符串,URI 的组成部分
  • 例:
    • 错误的用法:

var URL = "http://www.a.com?foo=http://www.b.com?t=123&s=456";

encodeURIComponent(URL);

// "http%3A%2F%2Fwww.a.com%3Ffoo%3Dhttp%3A%2F%2Fwww.b.com%3Ft%3D123%26s%3D456"

 

    • 正确的用法:

var param = "http://www.b.com?t=123&s=456"; // 要被编码的参数

URL = "http://www.a.com?foo="+encodeURIComponent(param);

//"http://www.a.com?foo=http%3A%2F%2Fwww.b.com%3Ft%3D123%26s%3D456"

 

4. decodeURIComponent()

  • 用于解码由 encodeURIComponent 方法或者其它类似方法编码的部分
  • 语法:
    • decodeURIComponent(encodedURI)
      • 参数encodedURI:编码后的部分URI

推荐阅读