75 php encoding character-encoding
我正在编写一个从数据库源中提取的php程序.一些varchars的引号显示为带有问号的黑色钻石( ,REPLACEMENT CHARACTER,我假设来自Microsoft Word文本).
我如何使用PHP来剥离这些字符?
小智 70
如果你看到那个字符( 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().
tro*_*skn 41
这是一个charset问题.因此,它可能在许多不同的级别上出错,但很可能,数据库中的字符串是utf-8编码的,并且您将它们呈现为iso-8859-1.或者相反.
解决这个问题的正确方法是让你的角色设定一致.由于您使用的是PHP,因此最简单的策略是在整个应用程序中使用iso-8859-1.为此,您必须确保:
charset=iso-8859-1header.accept-charset在<form>元素上指定属性.如果您的数据库中已有数据,您应该知道它们可能已经搞砸了.如果您尚未处于生产阶段,只需擦除它并重新开始.否则你将不得不做一些数据清理.
当Web服务器提供文件(HTML文档)时,它会发送一些信息,这些信息不会直接在浏览器中显示.这称为HTTP标头.一个这样的标题是Content-Type标题,它指定文件的mimetype(例如text/html)以及编码(aka charset).虽然大多数网络服务器都会发送Content-Type带有charset信息的标头,但它是可选的.如果它不存在,浏览器将改为解释任何元标记http-equiv="Content-Type".重要的是要意识到只有在网络服务器不发送标题时才会解释元标记.在实践中,这意味着它仅在页面保存到磁盘然后从那里打开时使用.
这个页面对这些东西有很好的解释.
Kai*_*ack 31
我也遇到过这个问题.与此同时,我遇到了三起案件:
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()而不是.
我希望这些额外的信息有助于摆脱这些问题.
小智 10
如前面的答案所述,它正在发生,因为您的文本已经以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文件中使用的字符编码和数据库的内容,并注意保持一致,或者在无法实现的情况下正确转换.
我选择通过这样做将这些字符从字符串中剥离 -
ini_set('mbstring.substitute_character', "none"); 
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
小智 5
只需将此代码粘贴到页面顶部即可。
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
这可能是由 unicode 或其他字符集不匹配引起的。尝试更改浏览器中的字符集,在设置中文本看起来会正常。接下来的问题是如何将数据库内容转换为用于显示的字符集。(实际上可以只是将 utf-8 字符集语句添加到输出中。)