在向服务器执行 http-get 请求时,我仍然不明白 使用 JS 函数 encodeURIcomponent 对 http-get 的每个组件进行编码的优势是什么。
做一些测试时,我看到 服务器(使用 PHP)如果我不使用 encodeURIcomponent 也能正确获取 http-get 请求的值!
显然我仍然需要在客户端级别对特殊字符 & 进行编码? =/:否则像“peace&love=virtue”这样的 http-get 值将被视为 http-get 请求的新键值对,而不是单个值。
但是,为什么 encodeURIcompenent 还要编码许多其他字符,例如 'è',例如,它被翻译成 %C3%A8,必须在 PHP 服务器上使用 utf8_decode 函数对其进行解码。
通过使用 encodeURIcomponent,http-get 请求的所有值都是 utf8 编码的,因此在 PHP 中获取它们时,我必须每次在每个 $_GET 值上调用 utf8_decode 函数,这是 非常烦人的 。
为什么我们不能只对 & 进行编码? =/:字符?
另见:JS encodeURIComponent result different from the one created by FORM
它表明 encodeURIComponent 甚至没有正确编码,因为一个简单的浏览器 FORM GET 以不同的方式对像“€”这样的字符进行编码。所以我还是想知道这个 encodeURIComponent 是做什么用的?
最佳答案
这是字符编码问题 ( again )。正如 Gaby 所说,URI 是一个 ASCII 字符序列(因此只有 0-127 范围内的字节)。因此,任何其他非 ASCII 字符都需要使用 Percent-Encoding 进行编码。
由于 UTF-8 是新的“通用字符编码”,现在用户代理将 URI 解释为 UTF-8 编码。但是这些 UTF-8 编码的单词本身也使用百分比编码进行编码,因为 URI 不能包含除 ASCII 中的字符之外的任何其他字符。
这意味着,当您在浏览器的地址字段中输入 http://en.wikipedia.org/wiki/€
时,您的浏览器会查找 €
(0xE282AC) 的 UTF-8 代码并对其应用百分比编码 ( %E2%82%AC
)。所以 http://en.wikipedia.org/wiki/€
实际上会导致 http://en.wikipedia.org/wiki/%E2%82%AC
。
为了证明这是真的,只需在地址字段中输入 http://en.wikipedia.org/wiki/%E2%82%AC
,您的浏览器可能会将其转换为 http://en.wikipedia.org/wiki/€
。这是因为现在用户代理将 URI 解释为 UTF-8 编码。
现在回到你最初的问题,为什么你应该明确应用百分比编码:假设你有一个网页,你想在其中链接到关于欧元符号的维基百科文章。如果您只使用简单的 €
编写 URI:
<a href="http://en.wikipedia.org/wiki/€">Euro sign</a>
您的浏览器将使用文档的字符编码作为
€
字符。这意味着,如果您的文档的编码是 Windows-1252(如在 your other question 中),则 €
将被编码为 0x80 并且 URI 将是 http://en.wikipedia.org/wiki/%80
(这实际上有效,因为维基百科很聪明地猜测,因为 Windows-1252 是最受欢迎的字符使用 0x80 上的可打印字符进行编码)。但是如果您的文档的编码是 ISO 8859-15,那么
€
将被编码为 0xA4,代表 ISO 8859-1 中的 currency sign ¤
(维基百科将选择 ISO 8859-1,因为 0xA4 是 UTF-8 和 HTTP specifies ISO 8859-1 as default character encoding 中的无效字节序列)。所以我建议 总是使用百分比编码来避免错误 。不要让用户代理猜到你的意思。
关于php - encodeURIComponent 真的有用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2238515/