PHP如何确定浏览器POST请求数据中的字符编码?

2024-03-11

当浏览器在 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 请求接收到的数据?


对于 GET 数据,W3C 标准规定 https://www.w3.org/TR/html401/interact/forms.html#h-17.13

笔记。 “get”方法将表单数据集值限制为 ASCII 字符。
仅指定“post”方法(带有 enctype="multipart/form-data")来覆盖整个 [ISO10646] 字符集。

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

URL编码将所有非ASCII字节转换为“%xx”的形式,“xx”是字节的HEX值。

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

<meta charset="utf-8">

or

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

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

进一步阅读

  • https://www.w3.org/TR/html401/interact/forms.html https://www.w3.org/TR/html401/interact/forms.html
  • 全程UTF-8 https://stackoverflow.com/questions/279170/utf-8-all-the-way-through
  • http://www.herongyang.com/PHP/Non-ASCII-Form-Basic-Rules.html http://www.herongyang.com/PHP/Non-ASCII-Form-Basic-Rules.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP如何确定浏览器POST请求数据中的字符编码? 的相关文章

  • 在 PHP 数组定义中显示重复键警告

    下面的代码是否可以得到警告 error reporting E ALL s array a gt 1 a gt 1 var export s 你唯一的希望 除了count 你自己 是你的编辑足够聪明 可以突出显示拼写错误 此屏幕截图来自 P
  • 如何配置 nginx 重写规则以使 CakePHP 在 CentOS 上运行?

    大家好 请帮帮我 我正在尝试在运行 Nginx 和 Fact CGI 的 Centos 服务器上设置 cakephp 环境 我已经在服务器上运行了一个 WordPress 站点和一个 phpmyadmin 站点 因此我已经正确配置了 PHP
  • Laravel Eloquent 预加载:加入同一个表两次

    我有一个users表和一个约会桌子 在约会表中 我有两个用户 ID customer id staff id 我想检索所有带有客户姓名和员工姓名的约会 users table id name appointments table id st
  • 在多维数组 PHP 的所有键中搜索

    我想在多维数组中的所有键中搜索特定字符串 我只需要弄清楚它是否存在 仅此而已 我想知道访问者的 IP 是否存在于任何数组中 有没有我可以用来执行此操作的 php 函数或方法 我尝试过的每个函数或方法总是返回 false 数组中 数组搜索 数
  • 获取给定日期时间集的每月第一个星期一

    我需要什么 我有一个特定的日期时间列表 我想获取每个日期时间的第一个星期一 例如 假设给定的日期时间是 2013 07 05 2013 08 05 2013 09 13 etc 我想获得所有这些日期时间的第一个星期一 以便输出结果 2013
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • 是否可以在 UML 中可视化一堆函数

    我正在改进一个使用类和函数文件 只是包含各种函数的 php 文件 的内容管理系统 例如 我有一堂课叫Admin以及一个功能文件 其功能包括显示管理员概述 创建新管理员 编辑现有管理员 删除管理员 函数文件使用类并执行 mvc 概念的可视化部
  • PHP 读取使用 setcookie() 创建的 cookie

    来自manual https www php net setcookie 直到下一次加载 Cookie 应该可见的页面之前 Cookie 才会变得可见 这意味着创建的 cookiesetcookie将无法访问 COOKIE直到下一页加载 有
  • 将 PHP 中的 openssl AES 转换为 Python AES

    我有一个 php 文件 如下所示 encryption encoded key c7e1wJFz PBwQix80D1MbIwwOmOceZOzFGoidzDkF5g function my encrypt data key encrypt
  • 查明具有特定 ID 的会话是否已过期

    我正在创建一个上传功能 将用户上传的文件存储在服务器上 并以用户的会话 ID 作为名称 现在 我只想将此文件保留在服务器上 直到该会话处于活动状态 所以 我的问题是 如何根据会话 ID 确定会话是活动的还是过期的 以便在后一种情况下我可以安
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 计算 PHP 字符串中特定字符的所有出现次数的最有效方法是什么?

    计算 PHP 字符串中特定字符的所有出现次数的最有效方法是什么 用这个 echo substr count abca a will echo 2
  • php隐藏所有错误[重复]

    这个问题在这里已经有答案了 隐藏的最佳做法是什么allPHP 错误 因为我不想向用户显示错误 我尝试过使用 htacess通过输入代码php flag display errors off在那里 但它返回给我一个500 error 还有其他
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 优雅地退出 Laravel 作用域

    我有一个范围 它根据用户角色以限制方式起作用 您可以将一组规则转发到限制数据库最终输出的范围 一个非常简化的角色限制示例 first name foo 只会返回其记录first name开始于foo 这实际上意味着我已禁止具有该角色的用户查
  • PHP 中的异或加密

    我是 Xor 加密的新手 并且在使用以下代码时遇到了一些问题 function xor this string Let s define our key here key magic key Our plaintext ciphertext
  • Lumen:无法打开流:.../vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107 中的权限被拒绝

    My OS is ubuntu 16 04 and I am running Lumen 5 5 When I try to run the app in the browser I get an error 500 我在 var log
  • PHP Json_encode 将空格更改为加号 +

    我有一个网络应用程序 我首先将 JSON 数据存储在 cookie 中 然后每 x 秒保存到数据库 它只是打开与服务器的连接 服务器读取 cookie 它实际上并不通过 POST 或 GET 发送任何内容 当我保存到 cookie 时 我的
  • 我如何向 Windows Server IIS 7 中的文件夹授予权限

    我是 PHP 和 Windows Server 新手 在查看我在 PHP 中创建的表单时遇到以下错误 Error in exception handler The stream or file C inetpub wwwroot wrp a

随机推荐

  • PHP 无法从接口扩展?

    我在一个 php 文件中写了下面的内容 人是一个界面 工程师扩展了人 但是当我运行这段代码时 出现错误 Fatal error Class engineer cannot extend from interface people in E
  • 正则表达式用于获取最后一个斜杠之后的所有内容[重复]

    这个问题在这里已经有答案了 我正在浏览 stackoverflow 并注意到用于匹配最后一个斜杠之后的所有内容的正则表达式是 例如 如果你有http www blah com blah test http www blah com blah
  • Java - 接口实现中的方法名称冲突

    如果我有两个接口 它们的用途完全不同 但具有相同的方法签名 那么如何使一个类实现这两个接口 而不必被迫编写一个为这两个接口服务的方法并在该方法中编写一些复杂的逻辑 检查正在进行的调用的对象类型并调用正确的代码的实现 在 C 中 这个问题可以
  • 将有角度的材料卡对齐在页面中心

    我制作了一个注册脚本 允许用户注册到我的网站 现在我遇到的问题是注册界面所在的有角材料卡不在中心 我尝试过很多事情 包括
  • WSO2 ESB:WSO2 REST API 调用中的 XML 响应未解析

    我在 WSO2 ESB 4 8 1 代理服务中处理来自 REST API 的纯 XML 响应时遇到问题 我的 outSequence 显然期望 API 调用结果有效负载是 SOAP 消息 但事实并非如此 纯 XML 从而在进一步处理它时导致
  • 是否可以在 ElasticSearch 中对嵌套文档进行排序?

    假设我有以下映射 site properties title type string description type string category type string tags type array point type geo p
  • 注释类型测试的超时参数

    我正在尝试在 IntelliJ IDEA 项目内的单元测试中使用注释类型测试的超时参数 第二个可选参数超时会导致测试失败 如果 花费的时间比指定的时钟时间长 以 毫秒 以下测试失败 Test timeout 100 public void
  • iPhone自动旋转动画

    是否可以关闭自动旋转动画 我希望它旋转 但我只是不希望发生动画 就像即时切换一样 如果你确实需要 只需使用setAnimationsEnabled of UIView void willRotateToInterfaceOrientatio
  • Spacemacs 中的 Org-mode:with-eval-after-load 和 extra-packages

    背景 Spacemacs 文档推荐 http spacemacs org layers emacs org README html important note您将其他组织模式配置包装在其中 with eval after load org
  • 如何在 Silverlight 中克隆路径资源?

    我的 Xaml 文件中定义了一个资源 如下所示
  • MVC 在剃刀中循环,生成的下拉列表未选择值

    我在 razor 中有一个循环 它会多次生成模板 模板内有一个下拉列表 Html DropDownlistFor x gt x pasajero i option Model optionItems 下拉列表已呈现 但未设置任何选项sele
  • 如何等待来自 WatiN 的 jQuery Ajax 请求完成?

    我在写WatiN http watin sourceforge net 测试来测试Ajax http en wikipedia org wiki Ajax 28programming 29Web 应用程序 并遇到了 Ajax 请求的计时问题
  • contenteditable div退格和删除文本节点问题

    contenteditable div 以及删除可编辑 div 内的 html 和 或非内容可编辑内容存在很多问题 使用优秀 Tim Down 的回答 如何删除具有 contentEditable 属性的 div 内的 HTML 元素 ht
  • 如何使用激活器调试Play应用程序?

    我知道对于经典的 Play 框架来说它是play debug run 我尝试跑步activator debug run但我收到以下错误 error Not a valid command debug similar idea error N
  • rake asset:预编译中止,无法推送到heroku

    我正在使用 Enki 博客 gem 它在本地工作 尝试准备推送到 heroku 以前从未遇到过问题 我尝试预编译 它做到了这一点 Users me rvm rubies ruby 1 9 3 rc1 bin ruby Users me rv
  • UITableView 背景颜色 iOS 9

    我有一个 UITableView 我想将其背景颜色设置为透明 界面生成器中表视图和所有子视图的背景颜色设置为透明 它适用于 iOS 8 和 7 但不适用于 iOS 9 有什么想法吗 cellForRowAtIndexPath 方法 cell
  • 如何将 Entity Framework 4.0 与 Xml 或内存存储(非 SQL)结合使用

    如何为实体框架模型指定 Xml 或仅指定内存存储 连接字符串需要提供程序 通常是 SQL 提供程序字符串 但它不会让我忽略提供者 我意识到我可以完全抛弃设计器生成的对象并采用纯 POCO 但随后我必须实现自己的序列化层 可以做到这一点 但对
  • 我无法修改的库中类的 Wcf 数据契约

    嗨 我有一个类库 它执行方法 并且有很多不同的类 它用作方法调用的参数 我正在为这个类库创建一个 wcf 包装器 但我无权更改类库 现在我的问题是如何轻松地将这些类公开为数据契约 数据成员 我有大约 100 个不同的类 我需要这些方法 Th
  • 如何在 iPhone 触摸屏上实现 onmousedown 和 onmouseup

    我对 HTML JavaScript 很陌生 但正在学习 我想在 iPhone 上制作一个按钮 按下时运行 JavaScript 命令 松开时运行另一个按钮 我尝试使用以下方法来做到这一点onmousedown and onmouseup属
  • PHP如何确定浏览器POST请求数据中的字符编码?

    当浏览器在 POST 请求正文中发送数据时 即name value来自表单元素的对 PHP 如何确定字符编码 以便它可以正确地将位流解码为字符以供其内部使用 我可以理解 PHP 不需要解码的某些任务 例如对于 SQL INSERT 查询 它