PHP输出显示带有问号的小黑钻石

时间:2008-11-09 00:21:56

标签: php encoding character-encoding

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

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

21 个答案:

答案 0 :(得分:67)

如果您看到该字符( U + FFFD“REPLACEMENT CHARACTER”),通常意味着文本本身以某种形式的单字节编码进行编码,但在其中一种unicode编码(UTF8或UTF16)中进行解释。

如果是相反的话,它通常会看起来像这样:ä。

原始编码可能是ISO-8859-1,也称为Latin-1。您可以在不更改脚本的情况下进行检查:浏览器为您提供了以不同编码重新解释页面的选项 - 在Firefox中使用“查看” - > “字符编码”。

要使浏览器使用正确的编码,请添加如下所示的HTTP标头:

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

或将编码放在元标记中:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

或者,您可以尝试使用其他编码(最好是UTF-8)从数据库中读取数据,或者使用iconv()转换文本。

答案 1 :(得分:41)

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

解决这个问题的正确方法是让你的角色设定一致。由于您使用的是PHP,因此最简单的策略是在整个应用程序中使用iso-8859-1。为此,您必须确保:

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

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

关于元标签的说明,因为每个人都误解了它们是什么:

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

This page对这些事情有很好的解释。

答案 2 :(得分:27)

我也遇到过这个问题。与此同时,我遇到了三起案件:

  1. substr()

    我在用于剪切UTF8字符的UTF8字符串上使用substr(),因此无法正确显示剪切字符。请改用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()代替。

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

答案 3 :(得分:9)

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

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

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

答案 4 :(得分:8)

要确保您的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

答案 5 :(得分:6)

根据您对问题的描述,数据库中的数据几乎肯定会编码为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文件中使用的字符编码和数据库的内容,并注意保持一致,或者在无法做到的情况下正确转换。

答案 6 :(得分:3)

我选择将这些字符从字符串中删除 -

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

答案 7 :(得分:3)

请尝试此

mb_substr($ description,0,490,&#34; UTF-8&#34;);

答案 8 :(得分:3)

将此函数添加到变量中 utf8_encode($ your variable);

答案 9 :(得分:1)

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

答案 10 :(得分:1)

这会对你有所帮助。将其放在<head>标记

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

答案 11 :(得分:1)

在我修复我的桌子之后最终做的是将它备份并将设置更改为utf-8然后我改变了我的转储文件,以便DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci是我的字符集条目< / p>

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

我弄清楚是什么造成的。这是DB上的网页+浏览器效果。在linux(ubuntu + firefox)的终端上,它是在latin1中编码数据库,这是tabes的设置。但是在Windows 10 +边缘终端上,条目被强制编码为utf8。另外我注意到windows 10有问题留下latin1所以我决定随风弯曲并将所有转换为utf8。

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

答案 12 :(得分:1)

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

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

 if(ini_get('zlib.output_compression'))

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

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

它有同样的问题帮助了我。

或者您可以找到此符号的代码并使用regexp删除这些符号。

答案 15 :(得分:0)

出于全球目的。

而不是转换,编纂,解码每个文本,我更喜欢让它们原样,而是改变服务器的PHP设置。 所以,

  1. 让钻石
  2. 从浏览器中,在视图菜单上选择 “文本编码”,找到让你看到文字的那个 正确。
  3. 编辑你的php.ini并添加:

    default_charset = "ISO-8859-1"

  4. 或代替ISO-8859,适合您的文本编码。

答案 16 :(得分:0)

这恰好适用于我的情况:

$text = utf8_decode($text)

我将黑色钻石字符转换为问号,以便您可以:

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

答案 17 :(得分:0)

我运行&#34;检测编码&#34;我的整理在phpmyadmin中更改后的代码,现在它出现在Latin_1。

但是我遇到的情况是在我的应用程序中查找不同的数据异常以及我如何修复它:

我刚刚导入了一个混合编码的表(在某些行中有菱形问号,并且都在同一列中。)所以这是我的修复代码。我使用了utf8_decode进程来获取未定义的占位符,并在&#34;钻石问号&#34;的位置分配一个简单的问号。然后我使用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>";
        }

        ?>        

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

答案 20 :(得分:-2)

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