http – 为什么URL的编码和查询字符串部分不同?

我正在研究为什么我的查询参数有加号,而不是为什么他们的字符串ü而不是ü(UTF-8)作为编码的URL。

经过2个小时的思考,我的webapp与URL编码标准不兼容,我发现查询字符串的编码方案与URL的编码方式不同(这里我的意思是没有查询字符串的部分)。

例子:

>网址:

>空格编码
> UTF-8字符保留UTF-8字符

>查询参数:

>空格编码
> UTF-8字符编码为十六进制表示

所以有人可以告诉我为什么编码方案不同,因为查询参数是URL的一部分?

看到:

> wiki Percent-encoding
> wiki: Query String

URI始于RFC 1630,使用百分比编码作为允许“不安全”字符表示的方法。该原始版本实际上提到了ISO Latin 1字符集作为非ASCII字符的编码。那年的RFC 1738在定义网址时删除了这个对拉丁文-1的引用。

查询字符串格式实际上是一个不同但相关的编码,应用程序/ x-www-form-urlencoded,定义在RFC 1866以及HTML 2.0。它基于RFC 1738,但指定空格(不是所有的空格,只是ASCII码为0x20的字符)被”替换,并且换行符将被编码为CRLF(即,)。前者很可能是因为在表单提交中为一个非常常见的字符节省了2个字节,而费用是使用不太常见的额外字符的额外的2个字节,后者是为了避免在使用不同端点的系统之间传输时出现问题,线编码。非ASCII字符未被考虑。

URI的UTF-8编码在07年4月过去十多年,尽管各个协议可能已经指定了这个或另一个非ASCII字符的编码。为了保持向后兼容性,所有UTF-8八位字节必须进行百分比编码。伴侣RFC 3987定义了“国际化资源标识符”(IRI),它们基本上是“大多数代码点160以上的URI允许出现未编码”,但是许多协议仍然需要URI。请注意,您的上述声明是不正确的,因为URL可能不包含未编码的ü或任何其他非ASCII字符。

应用程序/ x-www-form-urlencoded已经以不同的方式进行国际化。 HTML5 specification of application/x-www-form-urlencoded明确允许任何ASCII兼容的字符集可用于查询字符串中的字符,实际上不同的字段可能使用不同的字符集,但所有非ASCII字节仍必须进行百分比编码。当在IRI的查询部分中使用时,如果使用适当的归一化UTF-8作为字符集,这些字符可能被表示为未编码,因为转换回URI会导致正确的应用程序/ x-www形式urlencoded数据。

http://stackoverflow.com/questions/5366007/why-does-the-encodings-of-a-url-and-the-query-string-part-differ

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:http – 为什么URL的编码和查询字符串部分不同?