【问题标题】:Getting special characters out of a MySQL database with PHP [duplicate]使用 PHP 从 MySQL 数据库中获取特殊字符 [重复]
【发布时间】:2013-03-31 07:58:39
【问题描述】:

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

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

我错过了什么?

【问题讨论】:

  • 与问题本身无关,但请使用 mysqli 或 PDO 而不是 mysql 扩展名,已弃用。
  • 您确定数据库中的内容实际上是 utf8 吗?
  • 我如何确定“数据库中的内容实际上是 utf8”?我将 ™ 字符直接输入到 phpMyAdmin 中,并且在 phpMyAdmin 中的任何地方我都看到字段和表格的 utf8...

标签: php mysql utf-8 character-encoding


【解决方案1】:

下面的代码对我有用。

$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'];
}

【讨论】:

  • 啊! "mysql_set_charset("UTF8");"确实解决了这个问题。只是不同时使用 htmlentities()。我没有意识到 htmlentities() 还需要指定一个字符集,如下所述:stackoverflow.com/questions/9103801/…
【解决方案2】:

有几件事可能会有所帮助。首先,即使您在标头中将字符集设置为 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'");

编辑

所以我刚刚阅读了一些游戏。首先让我告诉你,尽管我在 cmets 中提到了这些,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和数据库之间的问题。

【讨论】:

  • 添加 后没有变化。添加其他东西后,问题似乎变得更糟。我得到的是“⢔,而不是 ™ 的“�”。
  • 只是为了确保页面上的字符编码设置正确,如果您使用的是 firefox,请右键单击页面并转到显示编码的“查看页面信息”。它是否显示“UTF-8”或类似“ISO-8859-1”的内容?
  • 我不是字符编码方面的专家,但我之前已经得到它的工作。我不知道它是否会有所帮助,但您可能应该查看一些与 unicode 相关的 PHP 函数,例如 utf8_decodembstring 函数。
  • 是的,Firefox 确认它是 UTF-8。我会看看那些函数。
  • 在做了一些研究之后,我只是在我的答案中添加了更多内容。如果有任何帮助,请告诉我。
【解决方案3】:

您需要先执行以下查询。

mysql_query("SET NAMES utf8");   

【讨论】:

  • 请不要使用这个,它在某些情况下会造成SQL注入问题。使用 OP 已经使用的“官方”mysql_set_charset API。
  • 但我认为this question/answer 说的正好相反?
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2012-10-07
  • 1970-01-01
  • 2014-11-17
  • 2013-07-30
  • 2013-10-05
相关资源
最近更新 更多