当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《PHP输出显示带有问号的小黑钻石》经验,为你挑选了6个好方法。

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

我如何使用PHP来剥离这些字符?



1> 小智..:

如果你看到那个字符( U+ FFFD"REPLACEMENT CHARACTER"),它通常意味着文本本身以某种形式的单字节编码进行编码,但在一种unicode编码(UTF8或UTF16)中进行解释.

如果它是相反的方式它(通常)看起来像这样:Ã.

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

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

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

或者将编码放在元标记中:


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



2> troelskn..:

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

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

所有PHP源文件都保存为iso-8859-1(不要与cp-1252混淆).

您的Web服务器配置为使用 charset=iso-8859-1

或者,您可以使用在PHP文档中覆盖Web服务器设置header.

此外,您可以在HTML中插入元标记,它指定相同的内容,但这不是严格要求的.

可以accept-charset

元素上指定属性.

数据库表的编码为latin1

PHP与数据库之间的数据库连接设置为latin1

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

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

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

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



3> Kai Noack..:

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

    SUBSTR()

    我正在使用substr()UTF8字符串切断UTF8字符,因此切割字符无法正确显示.请mb_substr($utfstring, 0, 10, 'utf-8');改用.积分

    用htmlspecialchars()

    另一个问题是htmlspecialchars()在UTF8字符串上使用.修复是使用:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

    的preg_replace()

    最后我发现preg_replace()可能导致UTF问题.$string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);例如,代码将UTF字符串"F(×)= 2×-3"转换为"F 2​​ ".修复是使用mb_ereg_replace()而不是.

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


这正是我面临的问题.不知道mb字符串函数.

4> 小智..:

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

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

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



5> ptwiggerl..:

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



6> Daniel Cassi..:

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有