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-Type
头charset
信息,它是可选的。 如果不存在,浏览器将会用http-equiv="Content-Type"
来解释任何元标签。 认识到meta标签只有在web服务器没有发送标题时才被解释是很重要的。 实际上,这意味着只有当页面被保存到磁盘然后从那里打开时才会使用它。
这个页面对这些东西有很好的解释。
我也面临这个问题。 与此同时,我遇到了三起案件:
-
SUBSTR()
我在一个UTF8string上使用
substr()
来切割UTF8字符,因此剪切字符无法正确显示。 使用mb_substr($utfstring, 0, 10, 'utf-8');
代替。 积分 -
用htmlspecialchars()
另一个问题是在UTF8string上使用
htmlspecialchars()
。 修正是使用:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');
-
的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设置。 所以,
- 让钻石
- 从浏览器,在视图菜单上select“文本编码”,find让你看到你的文本正确的。
-
编辑你的php.ini并添加:
default_charset = "ISO-8859-1"
或者,而不是ISO-8859适合您的文本编码。
您还可以更改浏览器中的字符集。 只是为了debugging的原因。
在数据库和HTML中使用相同的字符集(如这里所build议的)并没有为我工作…所以记住代码是以HTML生成的,我select使用"
(HTML代码)或“ "
(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">