7

我有一个包含特殊字符(例如™)的表。

这个字符可以使用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);

我错过了什么?

4

3 回答 3

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'];
}
于 2013-04-09T04:12:05.510 回答
0

有几件事可能会有所帮助。首先,即使您在标头中将字符集设置为 UTF-8,这可能还不够。我之前已经看到浏览器忽略了这一点。尝试通过在 html 的头部添加它来强制它:

<meta charset='utf-8'>

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

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上的 Wikipedia 页面非常有帮助。假设您从数据库返回的值实际上已经是 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 和数据库之间的问题。

于 2013-04-09T03:39:05.923 回答
-2

您需要先执行以下查询。

mysql_query("SET NAMES utf8");   
于 2013-04-09T04:01:46.470 回答