我正在研究为什么我的查询参数中有加+
号而不是%20
为什么他们有字符串%C3%BC
而不是像编码URL那样的ü(UTF-8).
经过2个小时的思考,我的webapp与URL编码标准不兼容,我发现查询字符串的编码方案与URL的编码不同(这里我指的是没有查询字符串的部分).
例子:
那么有人可以告诉我为什么编码方案不同,因为查询参数是URL的一部分?
看到:
Ano*_*mie 26
URI起源于RFC 1630,使用百分比编码作为允许表示"不安全"字符的方法.这个原始版本实际上提到了ISO Latin 1字符集作为非ASCII字符的编码.那年晚些时候RFC 1738在定义URL时删除了对Latin-1的引用.
查询字符串格式实际上是一个不同但相关的编码,application/x-www-form-urlencoded,在RFC 1866中与HTML 2.0一起定义.它基于RFC 1738,但指定空格(不是所有空格,只有ASCII码0x20的字符)被'+'替换,并且换行符将被编码为CRLF(即%0D%0A
).前者很可能是因为在表单提交中为一个非常常见的字符节省了2个字节,代价是对一个不太常见的字符使用额外的2个字节,而后者是为了避免在使用不同字符串的系统之间进行传输时出现问题行编码.非ASCII字符未被考虑.
在RFC 3986中,URI中的UTF-8编码在十多年后出现,尽管各个协议可能早先指定了这种或另一种非ASCII字符编码.为了保持向后兼容性,所有UTF-8八位字节必须进行百分比编码.配套RFC 3987定义了"国际化资源标识符"(IRI),它基本上是"大多数代码点160及以上的URI允许显示为未编码的",但许多协议仍然需要URI.请注意,上面的语句不正确,因为U RL可能不包含未编码的ü或任何其他非ASCII字符.
application/x-www-form-urlencoded已经以不同的方式进行了国际化.application/x-www-form-urlencoded的HTML5规范明确允许任何与ASCII兼容的字符集可用于查询字符串中的字符,实际上不同的字段可能使用不同的字符集,但所有非ASCII八位字节必须仍然是百分比编码.当在IRI的查询部分中使用时,如果将正确规范化的UTF-8用作字符集,则可能无法编码这些字符,因为转换回URI将导致正确的应用程序/ x-www -form-urlencoded数据.