【问题标题】:Special characters in PHP / MySQLPHP / MySQL中的特殊字符
【发布时间】:2010-10-12 15:16:34
【问题描述】:

我在数据库中有包含特殊字符的单词(主要是西班牙语,如波浪线)。 在数据库中,所有内容都使用 PHPmyAdmin 正确保存和显示,但是当我获取数据(使用 PHP)并在浏览器中显示时,我得到一个奇怪的字符,比如“?”用一个正方形... 我需要一个一般性的修复,所以我不需要每次都转义每个字符,而且我可以将 PHP 表单中的特殊西班牙字符插入数据库......

HTML 是正确的:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

所有表和数据库都设置为 utf8_spanish

我得到的角色:�

有什么建议吗???

谢谢!!!

【问题讨论】:

    标签: php mysql special-characters


    【解决方案1】:

    我想提供更多关于vartec 提出的解决方案的详细信息,这是(取决于您的 MySQL 安装)最正确的解决方案。 首先,MySQL 中的字符集/编码问题是一个有点复杂的主题,在 MySQL 手册 Chapter 9.1 "Character Set Support" 中有广泛的介绍。在您的情况下,尤其是 9.1.4. "Connection Character Sets and Collations" 将是最相关的。

    简而言之:MySQL 必须知道您的客户端应用程序(从数据库 peroective 即您的 PHP 脚本)所期望的字符集/编码,因为它会从定义的内部字符集/编码中转码所有字符串数据服务器级、数据库级、表级或列级转换为连接字符集/编码。您在客户端使用 UTF-8,因此必须告诉 MySQL 您使用 UTF-8。这是通过 MySQL 命令SET NAMES 'utf8' 完成的,该命令必须作为打开连接时的第一个查询发送。根据您的安装和您在 PHP 脚本中使用的 MySQL 客户端库,这可以在每次连接时自动完成。

    如果您使用 PDO,只需设置配置参数即可

    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
    

    使用mysqli更改客户端字符集/编码更加简单:

    $mysqli = new mysqli("localhost", "user", "password", "db");
    $mysqli->set_charset("utf8");
    

    我希望这将有助于使整个事情更容易理解。

    【讨论】:

      【解决方案2】:

      连接后立即发出SET NAMES 'utf8':

      $mysqli = new mysqli("localhost", "user", "password", "database");
      $mysqli->query("SET NAMES 'utf8'");
      

      【讨论】:

        【解决方案3】:

        让 MySQL 自动翻译它

        $conn = mysql_connect('host', 'user', 'password');
        mysql_set_charset('utf8',$conn);
        

        http://es.php.net/manual/en/function.mysql-set-charset.php

        编辑:从我收集到的您的评论中,这实际上是用 latin1 编码的,所以

        mysql_set_charset('latin1_spanish_ci',$conn);
        

        【讨论】:

        • 我已经添加了它,但仍然没有任何改变。 $conn = new mysqli('localhost', $user, $pwd, 'maindb') or die ('Cannot open database');返回 $conn; mysql_set_charset('utf8',$conn);
        • 你的数据库编码是什么?
        • 顺便说一句。如果您在浏览器中手动选择 UTF8 作为编码,是否显示 OK?
        • 浏览器编码也在 utf8 中。顺便说一句,这是我得到的角色:�
        • 那么您实际上已将其编码为 ISO-8859-1(或 ISO-8859-15)
        【解决方案4】:

        我从某个地方发现了这个,从那以后一直在使用它,没有想太多。

        mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
        

        【讨论】:

          【解决方案5】:

          将 HTML 字符集更改为 ISO-8859-1 解决了问题!傻

          【讨论】:

          • 您阅读我对您的问题的回答了吗?更改 HTML 页面的字符集需要将静态 HTML 内容重新编码为 ISO-8859-1 字符集。使用正确的 MySQL 客户端编码将是最简单的解决方案。
          • 是的,我阅读了您的答案并进行了处理,但无法解决问题。我使用了 mysqli 选项,但没有任何改变...我没有太多要在 HTML 中修改的代码,所以更改为 ISO-8859-1 对我来说是一个不错的选择。非常感谢!
          • 黑色菱形 (�) 是浏览器表示 wtf 的方式。它来自具有 latin1 字符,但告诉浏览器显示 utf8 字符。听起来乔纳森在整个地方都有 latin1,除了这个地方。当然utf8是首选。
          【解决方案6】:

          天哪……这让我发疯了。我试图做同样的事情。 我添加了一个 utf-8 编码的 HTML 标头。几个小时后,mysqli_set_charset() 救了我,但我很高兴我现在可以使用它

          另一个尝试编码特殊字符和重音符号的函数是 htmlentities()

          【讨论】:

            【解决方案7】:

            你可以这样做:

            $link = mysql_connect("host", "user", "password");
            mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
            

            【讨论】:

              【解决方案8】:
              【解决方案9】:

              在处理特殊字符时,我总是注意以下几点:

              • 数据库、表和字段字符集均设置为 utf8_general_* 或 utf8_unicode_*
              • 我确保我的编辑器使用正确的字符集保存 PHP 文件
              • 我将 php.ini 中的 default_charset 设置为 UTF-8 或
              • 我发送一个 Content-Type: text/html; charset=UTF-8 标头
              • META 标记中的字符集是 UTF-8(这被 Content-Type HTTP 标头覆盖)
              • 连接到 MySQL 时,我发出以下查询:
                • 设置名称 utf8
                • 设置字符集 utf8
                • SET COLLATION_CONNECTION="utf8_general_ci"/"utf8_general_ci"

              【讨论】:

              • 你能解释一下使用mysqli连接时如何使用SET吗??
              • 只需使用 mysqli_query($query),其中 $query 是那些 SET... 查询之一。
              • 其实服务器端使用什么编码是无关紧要的,只要连接字符集能够代表服务器-、数据库、table-oder列编码中使用的所有字符。跨度>
              【解决方案10】:

              您确定您的数据库中有 UTF8 数据吗?

              【讨论】:

              • 数据库是 utf8_spanish.. 表是 utf8_spanish... 浏览器是 utf8.... 顺便说一句,这是我得到的字符:�
              【解决方案11】:

              对我有用的答案是 Stefan Gehrig 发布的答案:

              $mysqli->set_charset("utf8");

              我只需要在定义连接和解决问题后添加该行! :)

              (我正在发布答案,因为我无法发表评论......)。

              【讨论】:

                【解决方案12】:

                我的解决方案是: 做以上所有提供的 但我也在使用记事本++,并且必须保存文件 像这样:转到菜单选项卡中的编码 并保存文件->编码为utf8

                【讨论】:

                  【解决方案13】:

                  有趣的是,这段代码对我不起作用:

                  $link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
                  mysqli_set_charset($link, "utf8");
                  printf("Current character set: %s\n", mysqli_character_set_name($link));
                  //shows latin1
                  

                  但是,在条件中设置字符集是可行的:

                  if (!mysqli_set_charset($link, "utf8")) {
                      printf("Error loading character set utf8: %s\n", mysqli_error($link));
                      exit();
                  } else {
                      printf("Current character set: %s\n", mysqli_character_set_name($link));
                      //shows utf8
                  }
                  

                  我的设置:

                  $ rpm -qa|grep -E "php|maria"
                  mariadb-5.5.56-2.el7.x86_64
                  mariadb-server-5.5.56-2.el7.x86_64
                  mariadb-libs-5.5.56-2.el7.x86_64
                  php-pdo-5.4.16-45.el7.x86_64
                  php-cli-5.4.16-45.el7.x86_64
                  php-5.4.16-45.el7.x86_64
                  php-common-5.4.16-45.el7.x86_64
                  php-mysql-5.4.16-45.el7.x86_64
                  

                  【讨论】:

                    【解决方案14】:

                    这个答案here 对于那些通过 PHP 以 procedural 方式连接到他们的 MySQL 或 Mariadb 数据库的人会派上用场 像我一样使用 MySQLi 函数。

                    这里是您如何以程序方式进行操作的人。见下文;

                    <?php
                    
                    $host = "localhost";
                    $user = "user";
                    $passwd = "password";
                    $database = "database";
                    
                    $con = mysqli_connect($host, $user, $passwd, $database);
                    mysqli_set_charset($con, "utf8");
                    
                    // Check connection
                    if (mysqli_connect_errno()) {
                      echo "Failed to connect to MySQL: " . mysqli_connect_error();
                      exit();
                    }
                    
                    ?>
                    

                    【讨论】:

                      【解决方案15】:

                      以下答案可能对那些通过 PHPprocedural 方式连接到他们的 MySQL 或 Mariadb 数据库的人很有价值> 使用 MySQLi 函数,就像我在不通过 PDO(PHP 数据对象)连接时经常做的那样。

                      以下是您如何通过程序方式进行操作。见下文;

                      <?php
                      
                      $host = "localhost";
                      $user = "user";
                      $passwd = "password";
                      $database = "database";
                      
                      $con = mysqli_connect($host, $user, $passwd, $database);
                      mysqli_set_charset($con, "utf8");
                      
                      // Check connection
                      if (mysqli_connect_errno()) {
                        echo "Failed to connect to MySQL: " . mysqli_connect_error();
                        exit();
                      }
                      
                      ?>
                      

                      【讨论】:

                        猜你喜欢
                        • 2013-03-26
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-05-08
                        • 2015-12-31
                        • 2015-05-23
                        • 2014-11-17
                        • 1970-01-01
                        相关资源
                        最近更新 更多