【问题标题】:PHP 5.4 multipart/form-data UTF-8 encodingPHP 5.4 多部分/表单数据 UTF-8 编码
【发布时间】:2013-06-06 18:59:32
【问题描述】:

我在将表单数据发布为“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 错误吗?

【问题讨论】:

    标签: php encoding character-encoding php-5.4


    【解决方案1】:

    做一个简单的从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)
    

    【讨论】:

    • 谢谢您的回答,但是数据会以UTF-8字符集插入MySQL表中,因此将其转换为ISO-8859-9将是另一个麻烦。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            在这种情况下,我认为您不应该使用 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 代码,那么您可能会很清楚您正在尝试做什么以及出了什么问题...

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                您需要在 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。

                【讨论】:

                  【解决方案9】:

                  您的示例页面看起来是正确的,并且您所采取的步骤似乎涵盖了大部分要点,但我还要检查一件事。您写道,数据以 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 设置字符集。以这种方式准备连接对象,使您独立于数据库配置,如有必要,连接甚至会转换返回/发送的数据。

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

                  【讨论】:

                    【解决方案10】:

                    mb_internal_encoding("UTF-8");

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

                    【讨论】:

                      【解决方案11】:

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

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

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

                      这适用于 php 5.2.xx

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-03-28
                        • 2011-06-11
                        • 2016-01-26
                        • 2012-08-02
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多