【问题标题】:PHP output showing little black diamonds with a question markPHP 输出显示带有问号的黑色小菱形
【发布时间】:2010-09-21 11:36:44
【问题描述】:

我正在编写一个从数据库源中提取的 php 程序。一些 varchars 的引号显示为带有问号的黑色菱形(�,REPLACEMENT CHARACTER,我假设来自 Microsoft Word 文本)。

如何使用 php 去除这些字符?

【问题讨论】:

标签: php encoding character-encoding


【解决方案1】:
【解决方案2】:

我也遇到过这个问题。同时我遇到了三种情况:

  1. substr()

    我在 UTF8 字符串上使用 substr() 来剪切 UTF8 字符,因此剪切的字符无法正确显示。请改用mb_substr($utfstring, 0, 10, 'utf-8');Credits

  2. htmlspecialchars()

    另一个问题是在 UTF8 字符串上使用 htmlspecialchars()。解决方法是使用:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. preg_replace()

    最后我发现preg_replace() 会导致 UTF 出现问题。例如,代码$string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string); 将 UTF 字符串“F(×)=2×-3”转换为“F � 2�”。解决方法是改用mb_ereg_replace()

我希望这些额外的信息将有助于摆脱这些问题。

【讨论】:

  • 这正是我面临的问题。不知道 mb 字符串函数。
  • strtolower 函数也发生了这种情况。 PHP manual中涉及的所有函数
【解决方案3】:

这是一个字符集问题。因此,它可能在许多不同的级别上都出错了,但最有可能的是,数据库中的字符串是 utf-8 编码的,并且您将它们呈现为 iso-8859-1。或者反过来。

解决此问题的正确方法是正确设置字符集。由于您使用的是 PHP,因此最简单的策略是在整个应用程序中使用 iso-8859-1。为此,您必须确保:

  • 所有 PHP 源文件都保存为 iso-8859-1(不要与 cp-1252 混淆)。
  • 您的网络服务器配置为使用charset=iso-8859-1 提供文件
  • 或者,您可以使用 header 从 PHP 文档中覆盖网络服务器设置。
  • 此外,您可以在 HTML 中插入一个元标记,指定相同的内容,但这不是严格要求的。
  • 也可以在您的<form> 元素上指定accept-charset 属性。
  • 数据库表定义为 latin1 编码
  • PHP 与数据库之间的数据库连接设置为 latin1

如果您的数据库中已经有数据,您应该知道它们可能已经搞砸了。如果您尚未处于生产阶段,只需将其全部擦除并重新开始。否则你将不得不做一些数据清理。

关于元标记的注释,因为每个人都误解了它们是什么:

当网络服务器提供文件(HTML 文档)时,它会发送一些信息,这些信息不会直接显示在浏览器中。这称为 HTTP 标头。一个这样的标头是Content-Type 标头,它指定文件的mimetype(例如text/html)以及编码(又名字符集)。 虽然大多数网络服务器会发送带有charset 信息的Content-Type 标头,但它是可选的。如果它不存在,浏览器将改为使用http-equiv="Content-Type" 解释任何元标记。重要的是要意识到元标记在网络服务器不发送标头时被解释。实际上,这意味着它仅在页面保存到磁盘然后从那里打开时才使用。

This page对这些东西有很好的解释。

【讨论】:

    【解决方案4】:

    正如前面的答案所述,这是因为您的文本已以iso-8859-1 编码或任何其他格式写入数据库。

    所以你只需要在输出之前将数据转换为utf8

    $text = “string from database”;
    $text = utf8_encode($text);
    echo $text;
    

    【讨论】:

      【解决方案5】:

      要确保您的 MYSQL 连接设置为 UTF-8(或 latin1,具体取决于您使用的内容),您可以这样做:

      $con = mysql_connect("localhost","username","password");    
      mysql_set_charset('utf8',$con);
      

      或使用它来检查您使用的字符集:

      $con = mysql_connect("localhost","username","password");   
      $charset = mysql_client_encoding($con);
      echo "The current character set is: $charset\n"; 
      

      更多信息在这里:http://php.net/manual/en/function.mysql-set-charset.php

      【讨论】:

      • 这非常有用,解决了我在来自远程 MySQL 数据库的数据中的引号编码问题,谢谢!
      • @ptwiggerl 这帮助很大。
      • 我将一个网站迁移到另一台服务器,我遇到了这个问题,mysql_set_charset('utf8', $con);解决了!
      • 对于 mysqli 是这一行:mysqli_set_charset($conn, 'utf8');
      【解决方案6】:

      只需将此代码粘贴到页面顶部即可。

      <?php
      header("Content-Type: text/html; charset=ISO-8859-1");
      ?>
      

      【讨论】:

      • 请简要说明代码的作用。
      • 此 php 代码允许“ISO-8859-1”字符集,在此字符集中,此符号 � 显示为字符。
      【解决方案7】:

      根据您对问题的描述,您的数据库中的数据几乎肯定被编码为Windows-1252,而您的页面几乎肯定被编码为ISO-8859-1。这两个字符集是等效的,只是 Windows-1252 有 16 个额外的字符,这些字符在 ISO-8859-1 中不存在,包括左花引号和右花引号。

      假设我的分析是正确的,最简单的解决方案是将您的页面作为 Windows-1252 提供。这将起作用,因为 ISO-8859-1 中的所有字符也在 Windows-1252 中。在 PHP 中,您可以按如下方式更改编码:

      header('Content-Type: text/html; charset=Windows-1252');
      

      但是,您确实应该检查您在 HTML 文件中使用的字符编码以及数据库的内容,并注意保持一致,或者在不可能的情况下正确转换。

      【讨论】:

      • 这个建议的问题在于,此时数据很可能是不同字符集的混合。如果你不知道到底出了什么问题,如果你只是到处乱扔一些修复程序,事情就会变得更加混乱。
      • 我同意。我对我的帖子进行了一些编辑,以反映该解决方案不能替代了解您在做什么。但是,我得出的结论是,大多数开发人员要么无法理解这个问题,要么根本不在乎。在我工作的地方,它似乎每月至少出现一次。
      • 这也是我的观察。对于我所关心的,他们播种时收获。但你可能是对的;很有可能他的数据确实是 cp-1252 .. 至少有一部分是。
      • 我尝试了一系列解决同一问题的方法。这个用最少的努力立即生效
      【解决方案8】:

      我选择通过这样做从字符串中去除这些字符 -

      ini_set('mbstring.substitute_character', "none"); 
      $text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
      

      【讨论】:

      • 这太棒了,它对我有用,也试过 utf8_encode 和 ut8_decode - 没用。但是这个解决方案在我的情况下有效。谢谢。
      【解决方案9】:

      将此函数添加到您的变量中 utf8_encode($你的变量);

      【讨论】:

      • 请详细说明这个答案。
      • 这个函数可以让你删除特殊字符并返回字符google.com/…的utf8标准
      • 这适用于未正确显示的分数。
      • 在我看来,这些应该是可以接受的答案;这是唯一对我有用的方法,我都试过了。
      【解决方案10】:

      请试试这个

      mb_substr($description, 0, 490, "UTF-8");

      【讨论】:

        【解决方案11】:

        这将对您有所帮助。把这个放在&lt;head&gt;标签里

        <meta charset="iso-8859-1">
        

        【讨论】:

          【解决方案12】:

          这可能是由 unicode 或其他字符集不匹配引起的。尝试在浏览器中更改字符集,在设置中文本看起来不错。然后是如何将数据库内容转换为用于显示的字符集的问题。 (这实际上可以只是将 utf-8 字符集语句添加到您的输出中。)

          【讨论】:

            【解决方案13】:

            在修复表格后,我最终做的是备份它并将设置更改回 utf-8,然后我更改了转储文件,以便 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 是我的字符集条目

            现在我不再有字符集问题了,因为数据库和浏览器都是 utf8。

            我知道是什么原因造成的。这是对数据库的网页+浏览器效果。在 linux (ubuntu+firefox) 的终端上,它在 latin1 中对数据库进行编码,这就是 tabes 的设置。但是在 windows 10+edge 终端上,条目被强制编码为 utf8。此外,我注意到 windows 10 在 latin1 上存在问题,因此我决定顺其自然,将所有内容都转换为 utf8。

            我认为这是 Windows 10 的问题,因为我们开始使用 win 10 终端。 所以微软的错误再次导致问题。我仍然不知道为什么表单上的编码会发生变化,因为 Windows 10 中的浏览器显示 latin1 字符集,但是当它进入 utf8 编码时,我得到数据异常。但在 linux+firefox 中却没有。

            【讨论】:

              【解决方案14】:

              这恰好在我的情况下起作用:

              $text = utf8_decode($text)
              

              我把黑色菱形字符变成问号,这样你就可以:

              $text = str_replace('?', '', utf8_decode($text));
              

              【讨论】:

              • 警告$text = 部分:这将更改字符串中的所有问号,而不仅仅是菱形
              【解决方案15】:

              只需在标题之前添加这些行。

              将检索.doc/docx文件的准确格式:

               if(ini_get('zlib.output_compression'))
              
                 ini_set('zlib.output_compression', 'Off');
               ob_clean();
              

              【讨论】:

                【解决方案16】:

                当您从任何地方提取数据时,您应该使用前缀为 md_FUNC_NAME 的函数。

                遇到了同样的问题,它帮助了我。

                或者你可以找到这个符号的代码,用正则表达式删除这些符号。

                【讨论】:

                  【解决方案17】:

                  您还可以更改浏览器中设置的字符。仅出于调试原因。

                  【讨论】:

                    【解决方案18】:

                    在数据库和 HTML 中使用相同的字符集(如这里所建议的)对我不起作用...所以记住代码是作为 HTML 生成的,我选择使用&amp;quot;(HTML 代码)或我的数据库文本中使用引号的&amp;#34;(ISO Latin-1 代码)。这解决了问题,同时为我提供了一个引号。奇怪的是,在此解决方案之前,只有一些引号和撇号没有正确显示,而其他的则显示正确,但是,特殊代码在所有情况下都有效。

                    【讨论】:

                      【解决方案19】:

                      我在 phpmyadmin 中更改排序规则后运行了“检测编码”代码,现在它显示为 Latin_1。

                      但这是我在我的应用程序中发现不同的数据异常以及我如何修复它时遇到的:

                      我刚刚导入了一个混合编码的表(在某些行中带有菱形问号,并且都在同一列中。)所以这是我的修复代码。我使用了 utf8_decode 过程,它采用未定义的占位符并在“菱形问号”的位置分配一个普通的问号,然后我使用 str_replace 用引号之间的空格替换问号。 这里是 [代码]

                          include 'dbconnectfile.php';
                      
                        //// the variable $db comes from my db connect file
                         /// inx is my auto increment column
                         /// broke_column is the column I need to fix
                      
                            $qwy = "select inx,broke_column from Table ";
                            $res = $db->query($qwy); 
                      
                            while ($data = $res->fetch_row()) {
                            for ($m=0; $m<$res->field_count; $m++) {
                                 if ($m==0){ 
                                 $id=0;
                                 $id=$data[$m];
                             echo $id;
                                 }else if ($m==1){ 
                                   $fix=0;
                                   $fix=$data[$m];
                      
                      
                                   $fix = utf8_decode($fix);
                                   $fixx =str_replace("?"," ",$fix);
                      
                              echo $fixx;
                      
                              ////I echoed the data to the screen because I like to see something as I execute it :)
                                  }
                                  }
                               $insert= "UPDATE Table SET broke_column='".$fixx."'  where inx='".$id."'";
                                $insresult= $db->query($insert);
                            echo"<br>";
                              }
                      
                              ?>        
                      

                      【讨论】:

                      • 上面的代码修复了我的表格。但我建议您评论更新语句,以便您可以先查看它是否可以解决问题。
                      【解决方案20】:

                      出于全球目的。

                      我更愿意让它们保持原样,而不是转换、编码、解码每个文本,而是更改服务器 php 设置。 所以,

                      1. 让钻石

                      2. 在浏览器中,在视图菜单上选择 “文本编码”并找到让你看到你的文本的那个 正确。

                      3. 编辑你的 php.ini 并添加:

                        default_charset = "ISO-8859-1"

                      或者用适合您的文本编码的 ISO-8859 代替。

                      【讨论】:

                        【解决方案21】:

                        转到您的 phpmyadmin 并选择您的数据库,只需将该表字段的长度/值增加到 500 或 1000 即可解决您的问题。

                        【讨论】:

                          猜你喜欢
                          • 2013-04-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-11-19
                          • 2012-09-02
                          相关资源
                          最近更新 更多