6

我在将表单数据发布为“multipart/form-data”时遇到 UTF-8 编码问题,没有 multipart/form-data 一切正常。但是由于我必须在同一个帖子上上传文件,所以我需要使用 multipart/form-data。

从 PHP 5.3.x 升级到 PHP 5.4.4-14(与 Debian Wheezy 捆绑)后出现问题,相同的脚本适用于 PHP 5.3 测试服务器。

  • 我所有的文档都以 UTF-8 格式保存并带有<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">标签。
  • 我在不同的电脑上用不同的浏览器测试过
  • mb_detect_encoding() 将发布的字符串检测为 UTF-8
  • 我尝试AddDefaultCharset utf-8了 Apache 配置。

在这里你可以测试我的脚本,你可以复制/粘贴以下带有土耳其字符的字符串(例如字符串:öçşipğopüp)

http://sa.chelona.com.tr/haber-ekle.html

我还发现在UTF-8 text is garbled when form 在 PHP 中作为 multipart/form-data 发布时的相关问题,但它建议重新安装 apache/php,这对于我的情况是不可能的。这是一个已知的 PHP/Apache 错误吗?

4

11 回答 11

5

做一个从土耳其字母 ISO-8859-9的简单转换,UTF-8问题应该得到解决

iconv('UTF-8', "ISO-8859-9", $string);

示例输入:öçşipğopüp

示例表格:

<form method="post" enctype="multipart/form-data" action ="self.php">
<input type="text" name="hello" />
<input type="submit" name="test" />
</form>

简单的油底壳:

var_dump($_POST['hello'],iconv('UTF-8', "ISO-8859-9", $_POST['hello']));

输出

string 'öçşipğopüp ' (length=16)
string 'öçþipðopüp ' (length=11)
于 2013-06-27T16:51:11.387 回答
3

我写这篇文章是为了回答我自己的问题......我希望它对其他人有帮助......

如果您使用 PHP 5.4.x,将 mbstring.http_input 从“auto”设置为“pass”可能会解决您的问题。

于 2014-03-08T23:30:16.517 回答
1

我的 php 版本是 5.4.45,mbstring.http_input从更改autopass效果很好。在php.ini文件中,默认值为通过。有关此变量的更多详细信息,您可以在此处查看

于 2016-12-07T18:41:21.880 回答
0

如果取消注释 php.ini 中的默认字符集行有什么作用,那么很容易修复。记得更改后反弹apache。

于 2013-07-01T08:31:10.213 回答
0

您的示例页面看起来是正确的,并且您所采取的步骤似乎涵盖了大部分要点,但我还要检查一件事。您写道,数据以 UTF-8 字符集存储在 MySql 数据库中,但这并不一定意味着 PHP 连接对象也可以使用此字符集。

// tells the mysqli connection to deliver UTF-8 encoded strings.
$db = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
$db->set_charset('utf8');

// tells the pdo connection to deliver UTF-8 encoded strings.
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
$db = new PDO($dsn, $dbUser, $dbPassword);

上面的示例显示了如何为 SQLI 或 PDO 设置字符集。以这种方式准备连接对象,使您独立于数据库配置,如有必要,连接甚至会转换返回/发送的数据。

要在您的页面中对此进行测试,请确保在插入/查询数据库之前设置了字符集。

于 2013-07-03T15:07:57.543 回答
0

您需要在 PHP 和 HTML 中添加标题,例如小写:

    <?php header('content-type: text/html; charset=utf-8'); ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
    <form method="post" enctype="multipart/form-data" action ="self.php">
        ...
    </form>
    </body>
    </html>

请记住:将所有 php 和 html 文件保存在 utf-8 中,无需 BOM。

于 2013-07-03T13:46:25.370 回答
0

mb_internal_encoding("UTF-8");

在您的字符串之前添加此代码..

于 2014-02-24T14:21:49.933 回答
0

抱歉,这更像是一种解决方法而不是实际解决方案,但是如果所有传统方法都失败了,并且您无法重新安装任何东西,请尝试从 UTF8 代码点转换。类似于在发送之前使用 base64 编码,然后在接收时解码。或者转换为十六进制字符串,接收后解码。

于 2013-07-02T23:49:35.527 回答
0

在这种情况下,我认为您不应该使用 mb_detect_encoding 来确定编码。

如果您必须使用它,那么也许您需要设置检测顺序以确保 UTF-8 位于列表的较高位置,请参阅http://www.php.net/manual/en/function.mb-detect-order。 php

您已将表单的接受字符集设置为 UTF-8;您已将原始页面设置为 UTF-8:所有当前浏览器都将发送 UTF-8。HTML 5 指定了这个 FWIW:http ://www.w3.org/TR/2011/WD-html5-20110405/association-of-controls-and-forms.html#multipart-form-data

该字符串是 UTF-8,不要尝试对其进行任何转换,你会没事的。

但是,如果您发布一些 PHP 代码,那么您可能会很清楚您正在尝试做什么以及出了什么问题......

于 2013-07-01T17:03:16.897 回答
0

您应该尝试重新安装您的 wamp 或 xampp 或您的 apache 和 php。并在其他人的机器上使用相同的 php 版本运行您的代码。如果此代码运行,然后尝试找出它为什么在您的服务器中不起作用或检查您的 php.ini 文件中的 file_upload 扩展名。

于 2013-06-30T19:28:53.800 回答
0

经过很长时间尝试使用 unpack() 和来自答案的建议后,我发现了一个陷阱,也许你对编码问题有同样的原因。

我所要做的就是明确使用 utf-8 制作 htmlentities:

htmlentities(stripslashes(trim(rtrim($_POST['title']))), ENT_COMPAT, "utf-8");

这适用于 php 5.2.xx

于 2015-06-19T10:59:18.343 回答