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

时间:2013-04-09 03:08:02

标签: php mysql utf-8 character-encoding

我有一张包含特殊字符的表格,例如™。

可以使用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);

我错过了什么?

3 个答案:

答案 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");