php - $_POST 将从 utf-8 转换为 à à à 等

标签 php encoding utf-8 character-encoding mojibake

我是新来的,所以如果我做错了什么,我深表歉意。

我有一个将用户输入提交到另一个页面的表单。用户需要输入 ä、ö、é 等...我已将以下所有内容放入文档中:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
header('Content-Type:text/html; charset=UTF-8');
<form action="whatever.php" accept-charset="UTF-8">

我什至尝试过:

ini_set('default_charset', 'UTF-8');

当其他页面加载时,我需要检查用户输入的内容,例如:

if ( $_POST['field'] == $check ) {
  ...
}

但是,如果他输入类似“München”的内容,PHP 会将“München”与“München”进行比较,并且永远不会触发 TRUE,即使它应该触发。由于到处都指定了 UTF-8,我猜测服务器正在转换为其他内容(我在另一个线程上读到的 Windows-1252),因为它不支持或未配置为 UTF-8。在加载到生产环境之前,我在本地服务器上使用 Apache;我没有更改(也不知道如何更改)任何默认设置。我一直在 Windows 7 上工作,使用 Notepad++ 以 ANSI 编码我的文件进行编辑。如果我bin2hex('München')我得到'4dc3bc6e6368656e'。

如果我echo $_POST['field'];它会正确显示“München”。

我到处都进行了研究以寻求解释,我发现我应该包含那些我已经拥有的标签/标题。

非常感谢任何帮助。

最佳答案

您同时面临许多不同的问题,让我们从最简单的问题开始。

问题1)你说echo $_POST['field'];会正确显示? “显示”是什么意思?两种情况可以正确显示:

  • 该字段采用 UTF-8 格式,并且您的页面已声明为 UTF-8 并且浏览器将其显示为 UTF-8,或者,
  • 该字段采用 Latin-1 语言,并且浏览器已确定(通过自动检测启发法)您的页面采用 Latin-1 语言。

因此,echo $_POST['field']; 正确的事实告诉您什么都没有。

问题2)您正在使用

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
header('Content-Type:text/html; charset=UTF-8');

这是 PHP 代码吗?如果是,这将是一个错误,因为必须在发送任何字节之前设置 header 。如果这样做,您将不会设置 Content-Type header ,并且 PHP 应生成警告。

问题3)您正在使用

<form action="whatever.php" accept-charset="UTF-8">

某些浏览器(大多数是 IE)会忽略 accept-charset,如果它们可以强制以 ASCII 或 ISO Latin-1 发送数据。因此,数据将采用 UTF-8 格式并声明为 ISO Latin-1 或 ISO Latin-1 并作为 ISO Latin-1 发送(但第二种情况不是您的情况)。

看看https://stackoverflow.com/a/8547004/449288看看如何解决这个问题。

问题 4) 您要比较哪些字符串?例如,如果您有

$city = "München"
$_POST['city'] == $city

此代码的结果将取决于 PHP 文件的编码。如果文件采用 ISO Latin-1 编码,并且 $_POST 正确包含 UTF-8 数据,则 == 将比较不同的字节并返回 false。

关于php - $_POST 将从 utf-8 转换为 à à à 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9002701/

相关文章:

php - 将字符串附加到自身, 'X' 次(其中 'x' 是变量)

java - HTTP 传输编码 "gzip, chunked"未正确解释

java - 解码密码或一些更复杂的方式来为用户发送密码?

php - 我可以在 utf8mb4 mysql 数据库中安全地使用 utf8 表和列吗?

php - 如何通过 PHP 分隔 SQL 联合上的值

php - Woocommerce:支付网关自定义感谢页面

php - 在 Linux 或其他支持 UTF-8 的驱动程序上安装 SQLSRV 驱动程序?

php - 在 PHP 中从 "Java Escape"转换为索引

php - MySQL Delete Row 在需要时不删除多对多表中的值

python - Mechanize 提交表单字符编码问题