关于URI转义的疑惑
经常会看到浏览器会将URL中的字符转义成百分号加十六进制ASCII码值.最近查了些资料仍然不是很了解,求大师解答小弟几点疑惑.
首先,浏览器将URL转义后,服务器端如何判断是常用什么编码.或者说浏览器采用何种编码对字符进行转义.是根据网页本身的charset还是浏览器采用默认编码.
另外,如果服务器知道浏览器端采用何种编码转义了字符,那又如何区分字符是由一个字节还是两个字节构成呢?
再者,服务器端读取转义后的URL是怎么的?能否提供具体代码参考.最好是PHP的,当然JAVA,C#的也可...谢谢.
Answers
URI(Universal Resource Identifiers) 统一资源标识符, RFC 文献1630中定义了它详细的规范(1994年6月)
URI下面包含子集:
URL(Uniform Resource Locators) 统一资源定位符,RFC文献1738中定义了它详细的规范(1994年12月)
注:大多人可能熟悉"URL",而不是URI。URL是URI命名机制的一个子集。
在URI的规范中,资源描述文字,只允许使用字母,数字,安全字符,特殊字符,和转义字符.
其中转义字符在URL中规定是使用%和两个hex进行表示,所以也就是为什么浏览器的form post会自动进行转义成%xx的关系而不使用unicode常用的%uxxxx。
可以到W3网站看
http://www.w3.org/Addressing/URL/uri-spec.html
,搜索BNF for specific URL schemes
PS:在php中urlencode是对应URI,而rawurlencode则是对应URL,使用时要分清是使用URI格式还是URL格式
这也是为什么ECMAScript v3 反对使用escape()/unescape()(因为他们对UTF8字符转义后为%uxxxx),要使用 encodeURI() 和 decodeURI() 替代。
浏览器转义特殊字符,可以看 各浏览器对 URI 中非 ASCII 字符的处理有差异
而服务器是将相应的url编码转换换成字符,也就是%xx转换一个相等于ASCII对应码值的字符,而无论%xx%xx组成GBK,还是%xx%xx%xx组成UTF8,因为具体编码只有具体应用才知道
何区分字符是由一个字节还是两个字节构成呢?
这就牵涉到一个编码判断的问题,不过php提供一个mb_http_input,检测 HTTP 输入字符编码,具体可以看看手册上的介绍
mb_http_input