我正在编写一个从数据库源中提取的php程序.一些varchars的引号显示为带有问号的黑色钻石( ,REPLACEMENT CHARACTER,我假设来自Microsoft Word文本).
我如何使用PHP来剥离这些字符?
如果你看到那个字符( 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()
.
这是一个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"
.重要的是要意识到只有在网络服务器不发送标题时才会解释元标记.在实践中,这意味着它仅在页面保存到磁盘然后从那里打开时使用.
这个页面对这些东西有很好的解释.
我也遇到过这个问题.与此同时,我遇到了三起案件:
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()
而不是.
我希望这些额外的信息有助于摆脱这些问题.
如前面的答案所述,它正在发生,因为您的文本已经以iso-8859-1
编码或任何其他格式写入数据库.
所以你只需要utf8
在输出之前将数据转换为.
$text = “string from database”; $text = utf8_encode($text); echo $text;
要确保您的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
根据您对问题的描述,数据库中的数据几乎肯定会编码为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文件中使用的字符编码和数据库的内容,并注意保持一致,或者在无法实现的情况下正确转换.