我是新来的,所以如果我做错了什么,我深表歉意。
我有一个将用户输入提交到另一个页面的表单。用户需要输入 ä、ö、é 等...我已将以下所有内容放入文档中:
<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/