gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:05:46 27 4
gpt4 key购买 nike

我正在研究为什么我的查询参数中有加号 + 而不是 %20 以及为什么它们有像 %C3%BC 而不是编码 URL 那样的 ü (UTF-8)。

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

例子:

  • 网址:
    • 空格编码为 %20
    • UTF-8 字符保持 UTF-8 字符
  • 查询参数:
    • 空格编码为+
    • UTF-8 字符编码为十六进制表示

既然查询参数是 URL 的一部分,有人能告诉我为什么编码方案不同吗?

参见:

最佳答案

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 字符。

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

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

关于http - 为什么 URL 和查询字符串部分的编码不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com