【发布时间】:2016-09-08 01:16:02
【问题描述】:
当浏览器在 POST 请求的正文中发送数据(即来自表单元素的 name=value 对)时,PHP 如何确定字符编码以便它可以正确地将位流解码为字符以供其内部使用?
我可以理解一些 PHP 不需要解码的任务,例如对于 SQL INSERT 查询,它可以简单地将数据/字符串传递给 DBMS,无需额外处理。
但是对于文本处理/正则表达式操作,我想 PHP 需要将比特流解码为字符,然后才能对其执行测试、模式匹配等。
此外,似乎因为编码是由浏览器决定的,PHP 将需要浏览器提供有关它用于对 POST 数据进行编码的字符集的指导。
期望此指导将出现在请求标头中,我设置了一个文本表单
<meta charset="utf-8">
在包含表单的网页的头部,然后在输入一些值并提交表单后,请求头中没有包含关于它如何编码 POST 数据的明显信息
POST /experiments/foo.php HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 57
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost/experiments/how_does_php_encode_data_it_receives_from_browser.php
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
还是有其他事情发生?例如浏览器是否希望将字符编码为某些预先确定的标准?
PHP 如何知道如何解码从浏览器 POST 请求接收到的数据?
【问题讨论】:
-
密钥是
Content-Type: application/x-www-form-urlencoded见:w3.org/TR/html401/interact/forms.html#h-17.13.4 -
PHP 不会从网络请求中解码任何内容。网络服务器通常
apache处理请求并在需要时调用 PHP 解释器。浏览器告诉网络服务器它是如何对数据进行编码的,然后圆圈就开始了…… -
基本上你应该已经知道预期的字符编码是什么,并配置 PHP 以接受该编码。