15

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

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

<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”。

我到处寻找解释,我发现我应该包括我已经拥有的那些标签/标题。

任何帮助深表感谢。

4

5 回答 5

14

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

问题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代码吗?如果是,那将是一个错误,因为必须在发送任何字节之前设置标头。如果这样做,您将不会设置Content-Type标头,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。

于 2012-02-04T15:28:59.120 回答
3

另一个可能有用的解决方案是在 Apache 中,您可以在配置文件 (httpd.conf) 或名为 .htacess 的配置文件中放置一个指令AddDefaultCharset。它看起来像这样:

AddDefaultCharset utf-8

http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset

这将覆盖任何其他默认字符集。

于 2012-01-25T12:35:59.110 回答
3

我在我的 php.ini 文件中更改了“mbstring.detect_order = pass”并且我工作了

于 2016-03-09T07:06:06.137 回答
0

我在表单和文件中多次使用 Unicode 字符。到目前为止我没有任何问题。尝试执行以下步骤并检查结果:

  1. header('Content-Type:text/html; charset=UTF-8');从您的 HTML 表单代码中删除。
  2. 使用您的表单,就像<form action="whatever.php">没有accept-charset="UTF-8". (最好在你的表单标签中插入发送数据的方法)。
  3. 在目标页面(whatever.php)中,再次插入<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">标签<head>

我总是像我在这里提到的那样做我的项目,我对 Unicode 字符串没有任何问题。

于 2012-01-25T12:34:16.613 回答
0

这是由于 PHP 文件的字符编码。

München编码与源文件的字符编码一起存储,在这种情况下ANSI,当将该值与$_POST变量中提供的 UTF-8 编码值进行比较时,两者自然会有所不同。

您的问题的解决方案是以下之一:

  1. 使用与源文件相同的编码来提供和处理内容,在这种情况下可能是windows-1252.
    • 对于初学者来说,这将包括在提供 HTML 数据时更改content="text/html; charset=UTF-8"为。content="text/html; charset=windows-1252"
  2. 避免所有可能受UTF-8和之间的字符编码问题影响的windows-1252硬编码值,或多或少只包含包含英文字母和数字的硬编码值。
    • 任何UTF-8值都必须从确保它们被UTF-8编码的源中读取(例如,UTF-8用作存储编码和连接编码的数据库集)。
  3. utf8_encode()例如,将所有硬编码的作业包装在 中$value = utf8_encode ('München');
  4. 将源文件的编码更改为UTF-8.
    • 这可以通过多种方式完成,一个像样的文本编辑器将能够做到这一点,或者可以使用出色的libiconv,特别是对于批处理。

解决方案 1 或 4 都是我的首选解决方案,尤其是当项目涉及多人时。

作为旁注,一些文本编辑器(特别是Notepad++)可以选择使用UTF-8UTF-8 without BOM。(BOM字节顺序标记)UTF-8在 PHP 中编写标头时(通常在进行重定向时)是没有意义的并且会导致问题。这是因为BOM就在首字母前面<?php,导致服务器发送BOM就像前面有任何其他字符一样。不同之处在于您会注意到前面的字符,但BOM不会显示。
经验法则:始终使用没有 BOM 的 UTF-8。

于 2012-01-26T08:30:13.947 回答