URL字符串中的字符
URL中使用的字符必须来自ASCII的一个固定的子集,确切地讲,包括:
- 大写字母A-Z
- 小写字母a-z
- 数字0-9
- 保留字符:具有特殊含义的字符
; / ? : @ & = + $ , - 特殊字符
- _ . ! ~ * ' ( )
既然规定了URL中允许的字符范围,那么范围外的字符出现在URL字符串中的时候就要做编码处理。下面就详细说一下哪些字符需要编码以及原因:
- ASCII控制字符
控制字符是无法打印的,也就是说你在URL中根本就不能把它输入显示出来,需通过编码处理。 - 非ASCII字符
包含非ASCII字符的URL是无效的,所以需要做编码处理。 - 保留字符
上面不是说了保留字符可以出现在URL中吗?这里为什么又要提出来?保留字符是在URL中具有特殊意义的字符,但是如果这些字符在URL中的出现并不是完成它的特殊意义,那么就必须做编码处理,比如说"="有特殊意思,它隔断参数的名和值,但是如果"="本身就是名或者值的一部分的时候,它在URL中的作用就不是一个保留字符了,这时候就需要做编码处理,不然的话把它看作保留字符然后进行URL解析的时候就会出现问题。 - 不安全字符
下面是RFC文档中对不安全字符的描述:字符不安全的原因有很多。空格字符就是不安全的,因为URL在被转录或者被排版或者被字处理程序处理后其中重要的空格可能被忽略,而可忽略的空格却有可能被解释了。"<"和">"字符也是不安全的,因为它们被用来作为URL在文本中的分隔符;而在有些系统中用引号"来界定URL。"#"字符也是不安全的,因为它在万维网和其他一些系统中被用来从"片段/锚点"标识符中界定URL,所以它通常都要被编码。字符"%"被用来对其他字符进行编码,它也是不安全的。其他一些字符,如: "{", "}", "|", "", "^", "~", "[", "]", 和 "`",由于网关和其他传输代理有时会对这些字符进行修改,所以它们也是不安全的。
百分号编码(Percent-encoding)
上面说到了要对URL中非有效字符进行编码,那么如何进行编码呢?URL中使用百分号编码的方式进行编码,这个编码的方式为:
“%”后面跟着替换字符的ASCII值的十六进制表示形式。
空格是一种特殊情况,因为它太普遍了。除了编码为%20,空格可以编码为加号(+)。加号本身编码为%2B。
下面列出了一些常见字符的编码值:
字符 | 编码值 |
---|---|
: | %3A |
/ | %2F |
? | %3F |
# | %23 |
[ | %5B |
] | %5D |
@ | %40 |
! | %21 |
$ | %24 |
& | %26 |
' | %27 |
( | %28 |
) | %29 |
* | %2A |
+ | %2B |
, | %2C |
; | %3B |
= | %3D |
% | %25 |
空格 | %20 or + |
根据上下文的不同,空字符被翻译成'+'(类似于application/x-www-form-urlencoded消息中使用的百分比编码版本),或者像在Urls中编码成'%20'。
URL编码问题
下面的文章对URL编码问题描述得比较详细,跳转阅读: