gpt4 book ai didi

php - PHP如何判断浏览器POST请求数据中的字符编码?

转载 作者:可可西里 更新时间:2023-10-31 23:28:21 24 4
gpt4 key购买 nike

当浏览器在 POST 请求的主体中发送数据时(即来自表单元素的 name=value 对),PHP 如何确定字符编码以便正确地将位流解码为内部使用的字符?
我可以理解一些 PHP 不需要解码的任务,例如对于 SQL INSERT 查询,它可能只是将数据/字符串传递给 DBMS,无需额外处理。
但是对于文本处理/正则表达式操作,我想 PHP 需要将位流解码为字符,然后才能对它们执行测试、模式匹配等。
此外,由于编码是由浏览器决定的,PHP 需要浏览器指导它使用什么字符集对 POST 数据进行编码。
期望这个指导会出现在请求 header 中,我设置了一个文本表单

<meta charset="utf-8">

在包含表单的网页的头部,然后在输入一些值并提交表单后,请求 header 不包含有关它如何编码 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 请求接收的数据?

最佳答案

关于 GET 数据,W3C standard states

Note. The "get" method restricts form data set values to ASCII characters.
Only the "post" method (with enctype="multipart/form-data") is specified to cover the entire [ISO10646] character set.

因此,如果表单元素具有属性 enctype="multipart/form-data",则使用 GET 浏览器似乎被锁定为 ASCII。似乎标准支持更大的字符集 [ISO10646] .
我猜是因为它更接近纯比特流,所以默认 Content-typeapplication/x-www-form-url-encoded支持所有字符编码。这篇文章特别指出:
http://www.herongyang.com/PHP/Non-ASCII-Form-Basic-Rules.html

URL encoding converts all non ASCII bytes in the form of "%xx", "xx" is the HEX value of the byte.

所以这似乎解释了浏览器可能发送的字符集,但没有解释它如何指示 PHP 发送的实际字符集。 (除了 GET,PHP 知道它只能是 ASCII)。欧从我能理解的其他方面来看,浏览器基本上没有关于它发送的表单数据的字符编码的直接指导。
虽然我可能是错的,但我会对这个理论的任何反馈/替代方案感兴趣。
否则,据我所知,该方案的完整性基本上依赖于服务器简单地“记住”什么

<meta charset="utf-8">

<form ... accept-charset="utf-8">

它发送给用户的值(并希望用户没有通过浏览器“设置”更改字符编码)并期望浏览器将忠实地以该字符集发送后续请求。
所以换句话说,如果您的团队中有一位网页设计师负责 HTML,并且他们设置了 HTML 元标记 <meta charset="utf-8">他们需要通知数据库管理员,嘿,你需要设置你的数据库模式、表等以使用 UTF-8 编码
这是因为服务器端开发人员/DBA 将无法动态检查编码(例如,如果表单提交来自不同国家/地区的用户,其浏览器可能设置为某些不同的字符集)。
并可能拒绝或记录警告等...
基本上,开发人员似乎需要为每个包含表单的 HTML 页面显式设置字符集,例如与 <meta charset="utf-8">然后相信浏览器将使用与包含表单的 HTML 编码相同的字符集发送 POST 数据。

进一步阅读

关于php - PHP如何判断浏览器POST请求数据中的字符编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39381173/

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