使用PHP从MySQL数据库中获取特殊字符

Getting special characters out of a MySQL database with PHP

本问题已经有最佳答案,请猛点这里访问。

我有一张包含特殊字符的表,例如?.

这个字符可以使用phpmyadmin和其他软件输入和查看,但是当我使用php中的select语句输出到浏览器时,我会得到带有问号的菱形。

表类型为myisam。编码为UTF-8 Unicode。排序规则是utf8_unicode_ci。

HTML头的第一行是

1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

在输出字符串之前,我尝试对其使用htmlEntities()函数。运气不好。

我还尝试在任何输出之前将其添加到PHP中(没有区别):

1
header('Content-type: text/html; charset=utf-8');

最后,我尝试在初始mysql连接的正下方添加此项(这会导致显示额外的奇数字符):

1
$db_charset = mysql_set_charset('utf8',$db);

我错过了什么?


下面的代码适用于我。

1
2
3
4
5
6
7
$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'];
}


有几件事可能会有所帮助。首先,即使在头段中将字符集设置为utf-8,这可能还不够。我以前看到过浏览器忽略这一点。尝试通过在HTML头部添加以下内容来强制执行:

1
<meta charset='utf-8'>

接下来,如本文所述,尝试这样做:

1
2
3
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编码的工作原理,您就可以这样做:

1
2
3
4
$test ="?";
for($i = 0; $i < strlen($test); $i++) {
    echo sprintf("%b", ord($test[$i]));
}

它会像这样倾倒:

1
11100010 10000100 10100010

这是一个正确编码的utf-8'?'性格。如果从数据库中检索到的数据中没有这样的字符,那么就会出现一些混乱。

要进行检查,请尝试使用mb_strpos()搜索结果中已知的特殊字符:

1
var_dump(mb_strpos($db_result, '?'));

如果返回的不是false,那么来自数据库的数据就可以了,否则我们至少可以确定这是PHP和数据库之间的问题。


您需要先执行以下查询。

1
mysql_query("SET NAMES utf8");