PHP 5.4 multipart / form-data UTF-8编码

时间:2013-06-11 01:59:15

标签: php encoding character-encoding php-5.4

我在将表单数据发布为“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 is posted as multipart/form-data in PHP找到了相关问题,但它建议重新安装apache / php,这对我的情况来说是不可能的。这是一个已知的PHP / Apache错误吗?

11 个答案:

答案 0 :(得分:5)

执行从UTF-8Turkish Alphabet ISO-8859-9的简单转换,问题应该解决

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)

答案 1 :(得分:3)

我写这篇文章是为了回答我自己的问题...我希望它会帮助别人......

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

答案 2 :(得分:1)

我的php版本是5.4.45,将mbstring.http_inputauto更改为pass效果非常好。在php.ini文件中,默认值为pass。有关此变量的更多详细信息,您可以看到here

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果取消注释php.ini中的默认字符集行做了什么,ot将很容易修复。 记得在改变后反弹apache。

答案 5 :(得分:0)

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

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

您已将表单的accept-charset设置为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代码,那么很明显你要做的是什么以及出了什么问题......

答案 6 :(得分:0)

对不起,对于解决方法而言,这比实际解决方案更有意思,但是如果所有传统方法都失败了,并且您无法重新安装任何内容,请尝试从UTF8代码点进行转换。在发送之前使用base64编码然后在接收时解码的东西。或转换为十六进制字符串并在接收后解码。

答案 7 :(得分: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>

请记住:在没有BOM的情况下将所有php和html文件保存在utf-8中。

答案 8 :(得分: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设置字符集。以这种方式准备连接对象使您独立于数据库配置,如果有必要,连接甚至可以转换返回/发送的数据。

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

答案 9 :(得分:0)

mb_internal_encoding(“UTF-8”);

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

答案 10 :(得分:0)

经过很长一段时间尝试解压缩()和答案中的答案,我发现了一个陷阱,也许你有相同的编码问题的原因。

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

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

这适用于php 5.2.xx