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

我正在写一个从数据库源拉的PHP程序。 一些变数的引号显示为黑色菱形,其中带有问号( , replace字符 ,我从Microsoft Word文本中假设)。

我如何使用PHP去除这些字符?

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

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

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

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

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

或者将编码放在meta标签中:

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

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

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

解决这个问题的正确方法是让你的字符集合直。 最简单的策略,因为你使用的是在整个应用程序中使用iso-8859-1。 要做到这一点,你必须确保:

  • 所有的PHP源文件保存为iso-8859-1(不要和cp-1252混淆)。
  • 您的networking服务器被configuration为提供charset=iso-8859-1
  • 或者,您可以使用header覆盖PHP文档中的Web服务器设置。
  • 另外,你可以在你的HTML中插入一个元标签,它指定了同样的东西,但这不是严格需要的。
  • 可以在你的<form>元素上指定accept-charset属性。
  • 数据库表定义为编码为latin1
  • PHP到数据库之间的数据库连接设置为latin1

如果您的数据库中已经有数据,则应该意识到它们可能已经混乱了。 如果你还没有进入生产阶段,那就把它擦干净再重新开始。 否则,你将不得不做一些数据清理。

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

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

这个页面对这些东西有很好的解释。

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

  1. SUBSTR()

    我在一个UTF8string上使用substr()来切割UTF8字符,因此剪切字符无法正确显示。 使用mb_substr($utfstring, 0, 10, 'utf-8'); 代替。 积分

  2. 用htmlspecialchars()

    另一个问题是在UTF8string上使用htmlspecialchars() 。 修正是使用: htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. 的preg_replace()

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

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

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

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

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

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

为了确保你的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

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

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

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

我select通过这样去除string中的这些字符 –

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

试试这个请

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

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

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

现在我没有问题了,因为数据库和浏览器都是utf8。

我找出是什么原因造成的 这是网页+浏览器对数据库的影响。 在linux(ubuntu + firefox)的terminal上,它是在latin1中对数据库进行编码,这就是设置了tabes的地方。 但在Windows 10 +边缘terminal上,条目被强制编码为utf8。 另外我注意到Windows 10的问题留在拉丁语1,所以我决定随风弯曲,全部转换为utf8。

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

为了全球目的。

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

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

    default_charset = "ISO-8859-1"

或者,而不是ISO-8859适合您的文本编码。

您还可以更改浏览器中的字符集。 只是为了debugging的原因。

在数据库和HTML中使用相同的字符集(如这里所build议的)并没有为我工作…所以记住代码是以HTML生成的,我select使用&quot; (HTML代码)或“ &#34; (ISO拉丁-1代码)在我的数据库文本中使用引号。 这给我一个引号解决了问题。 很奇怪的是,在这个解决scheme之前,只有一些引号和撇号不能正确显示,而另外一些引号和撇号却不能正确显示,但是特殊代码在所有情况下都能正常工作。

在phpmyadmin进行sorting规则更改后,我运行了“检测编码”代码,现在它以Latin_1的forms出现。

但是在我的应用程序中,我遇到了一些不同的数据exception,我如何解决它:

我只是导入了一个具有混合编码的表格(在一些行中带有钻石问号,并且全部在同一列中),所以这里是我的修复代码。 我使用了utf8_decode作为未定义的占位符的过程,并在“钻石问号”处指定一个普通的问号,然后我用str_replace用引号之间的空格replace了问号。 这里是[code]

  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>"; } ?> 

这发生在我的情况下工作:

 $text = utf8_decode($text) 

我把黑钻石字符变成了一个问号,所以你可以:

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

将这个函数添加到你的variablesutf8_encode($你的variables);

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

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

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

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

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

或者你可以find这个符号的代码,并使用正则expression式来删除这些符号。

去你的phpmyadmin并select你的数据库,只是增加该表的字段的长度/价值500或1000它将解决你的问题。

这将帮助你。 把这个放在<head>标签里面

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