我有一张包含特殊字符的表格,例如™。
可以使用phpMyAdmin和其他软件输入和查看此字符,但是当我在PHP中使用SELECT语句输出到浏览器时,我会在其中获得带有问号的菱形。
表格类型是MyISAM。编码是UTF-8 Unicode。整理是utf8_unicode_ci。
html头的第一行是
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
我在输出之前尝试在字符串上使用htmlentities()函数。没有运气。
我还尝试在输出之前将其添加到php(没有区别):
header('Content-type: text/html; charset=utf-8');
最后我尝试在初始mysql连接下面添加这个(这导致显示其他奇数字符):
$db_charset = mysql_set_charset('utf8',$db);
我错过了什么?
答案 0 :(得分:6)
下面的代码适用于我。
$sql = "SELECT * FROM chartest";
mysql_set_charset("UTF8");
$rs = mysql_query($sql);
header('Content-type: text/html; charset=utf-8');
while ($row = mysql_fetch_array($rs)) {
echo $row['name'];
}
答案 1 :(得分:0)
有几件事可能会有所帮助。首先,即使你在标题中将字符集设置为UTF-8,这可能还不够。我见过浏览器忽略了之前。尝试通过在html的头部添加它来强制它:
<meta charset='utf-8'>
接下来,正如前面提到的here,尝试这样做:
mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
修改强>
所以我刚刚做了一些阅读。首先让我告诉你,尽管我在评论中提到了,utf8_encode()
和utf8_decode()
对你没有帮助。它有助于真正理解UTF-8编码。我发现UTF-8上的维基百科页面非常有帮助。假设您从数据库返回的值实际上已经是UTF-8编码的,并且您只是在获得它后立即将其转储出来然后应该没问题。
如果您正在对数据库结果执行任何操作(特别是以任何方式操作字符串)并且您不使用PHP mbstring库中的unicode感知函数,那么它可能会因为标准而搞乱它PHP字符串函数不能识别unicode。
一旦你理解了UTF-8编码的工作方式,就可以做到这样的酷事:
$test = "™";
for($i = 0; $i < strlen($test); $i++) {
echo sprintf("%b ", ord($test[$i]));
}
哪个会抛出这样的东西:
11100010 10000100 10100010
这是一个正确编码的UTF-8'''字符。如果你从数据库中检索到的数据中没有这样的字符,那么就会搞砸了。
要检查,请尝试使用mb_strpos()
搜索您知道在结果中的特殊字符:
var_dump(mb_strpos($db_result, '™'));
如果返回false
以外的任何内容,那么数据库中的数据就可以了,否则我们至少可以确定PHP和数据库之间存在问题。
答案 2 :(得分:-2)
您需要先执行以下查询。
mysql_query("SET NAMES utf8");