【问题标题】:Problem with PHP and Mysql UTF-8 (Special Character)PHP 和 Mysql UTF-8(特殊字符)的问题
【发布时间】:2011-10-27 18:05:53
【问题描述】:

我有一个带有一个名为(ProductTitle)的文本框的表单

如果我在文本框中写入示例“Étuit”并单击“保存”,我会将数据发布到名为 Product 的表中。 ProductTitle 数据库中的结果是 Étuit。我担心的是特殊字符。我没有将 É 放入数据库,而是得到了 É

当我将产品标题(“Étuit”)从数据库加载到跨度中时。正确显示。
但是当我将它加载到文本框中以编辑产品标题时,它显示了 Étuit。

任何人都知道为什么。

我把它放在html头中

<head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

注意:当我在表单上点击保存时,数据是使用 jquery ajax 方法发布的。

【问题讨论】:

  • 你的数据库的排序规则是什么?
  • 数据库和表上都是 utf8_general_ci
  • @Jean-Francois 角色“É”没有什么“特别”之处。另外,请查看当前接受的答案。这是错误的。

标签: php mysql utf-8 special-characters


【解决方案1】:

【讨论】:

  • 抱歉,但除非你能解释 utf8_encode 实际做了什么以及为什么这比@gview 的解决方案更好,否则我将不得不给你一个-1。
  • 尝试使用utf8_encode/utf8_decode 将文本“エンコード”保存到您的 UTF-8 数据库(应该能够处理它,对吗?),并告诉我它是否仍在工作。
  • 我不需要这些字符。我只需要像 éè 这样的法语字符。
  • @Jean-Francois 也许,但是使用此解决方案,您要么将垃圾存储在数据库中,要么将任何不属于 latin-1 编码的字符替换为问号,具体取决于您是否首先utf8_encode 然后解码,反之亦然。也许现在这不会打扰您,因为您只是碰巧只使用了 latin-1 可编码字符,但是 a)这样做您没有正确处理 UTF-8 并且 b)它可能有一天会回来咬您。要正确处理 UTF-8,请按照 @gview 的说明将数据库连接设置为 UTF-8。
  • 感谢 deceze,我正确配置了我的数据库。你完全正确。做正确的事一天付钱:)
【解决方案2】:

我也遇到了困难,但以下总是对我有用!在操作数据之前,请确保按如下方式设置编码:

try{
  $dbh = new PDO($dsn, $user, $pass);
  $dbh->query("SET NAMES 'utf8'");
  print "Connected";
 }

catch(PDOException $e){
  print "Error!!   " . $e->getMessage()."<br/>";
  die();
 }

【讨论】:

    【解决方案3】:

    我只是在使用 mysqli lib 时使用 set_charset 方法。

    error_reporting(E_ALL);
    
    $mysqli = new mysqli('localhost', 'login', "pass", 'database');
    
    if ( ! $mysqli->set_charset("utf8") )
    {
       printf("Error loading character set utf8: %s\n", $mysqli->error);
    }
    

    【讨论】:

      【解决方案4】:

      这些对我有用:

      在 HTML 标头中:

      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      

      PHP连接后:

      $conexion = @mysql_connect($servidor, $usuario, $contrasenha);
      mysql_select_db($BD, $conexion) or die(mysql_error($conexion));
      mysql_query("SET NAMES 'utf8'");
      

      【讨论】:

        【解决方案5】:

        这篇文章解释了如何在 PHP 和 MySQL 中配置和使用 UTF-8。 希望能节省您的时间。

        A UTF-8 Primer for PHP and MySQL

        【讨论】:

          【解决方案6】:

          在代码中每次连接之前不要打扰SET NAMES,可以使用mysql连接字符串中的参数:

          "jdbc:mysql://hostAddress:port/databaseName?characterEncoding=UTF-8"
          

          【讨论】:

            【解决方案7】:

            在使用 DB 之前尝试设置客户端编码。

            mysql_query("SET NAMES 'utf8'");
            

            如果上述方法不起作用,请使用 utf8 编码/解码函数:

            <?
            $string ="Étuit";
            ?>
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            </head>
            <?
            echo $string; // echo's '?tuit'
            echo utf8_encode($string); // echo's 'Étuit'
            ?>
            

            【讨论】:

            • 要么。如果您将所有内容都设置为 UTF-8,则不需要 utf8_encode。你知道这个函数实际上是做什么的吗?
            • deceze :它将字符串编码为 utf8。您在个人资料上的照片不错;)
            • 但是字符串已经用UTF-8编码了,至少它应该是!当您在我的个人资料中时,请点击查看我写的关于编码的长篇大论文章,该文章对此进行了更详细的介绍。
            • @deceze 你把这个功能太个人化了,给人的印象是所有正义的反对票。
            • 对于初学者,不要再如此居高临下。而不是“......你知道这个函数实际上是做什么的吗?”你可以说“根据 PHP 文档,这个函数实际上......你可以复制这种行为......”
            【解决方案8】:

            可能发生的情况是客户端的默认字符集未设置为 UTF-8,因此您在一个方向或另一个方向上进行换位。这有多种不同的方式here:

            通常,在连接被实例化之后对“SET NAMES utf8”的初始化查询将解决未来的问题,但请确保您认为存储的内容(utf8)实际上是存储的内容。如果没有,您可能需要进行清理工作。

            【讨论】:

            • 这里的问题是,所有的答案都很好,很难找到最好的答案。我使用 Doctrine ,没有必要在 mysql_query 上应用 Set Name。也感谢您的帮助
            • Jean-Francois,您可能想返回并编辑您的问题以表明涉及 Doctrine。这将是有用的信息。您是否使用 $manager->setCharset('utf8'); 配置连接?很高兴知道这最终是如何处理的,以供将来参考。
            • 正如@gview 的link 中的指南所建议的那样,设置html 表单属性“
              ”为我解决了OP 的问题。
            猜你喜欢
            • 2011-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-24
            • 1970-01-01
            • 1970-01-01
            • 2014-12-03
            相关资源
            最近更新 更多