MySQL 数据库中字符的 UTF-8 问题(例如 é as é)
Posted
技术标签:
【中文标题】MySQL 数据库中字符的 UTF-8 问题(例如 é as é)【英文标题】:UTF-8 problems with characters from MySQL database (e.g. é as é) 【发布时间】:2012-02-29 02:06:39 【问题描述】:我知道有数百个关于 UTF-8 问题的问题,但我尝试了所有我能找到的方法,但都没有帮助。
事实: 我正在尝试从我的 mysql 数据库中读取包含 é 的字符串并将其显示在 php 页面上。实际上,它确实显示为 é(但字体无法识别它,因此使用了另一种默认字体)。当我想使用 PHP 函数进行字符串替换将此字符串转换为文件名时,麻烦就出现了。 PHP 根本无法将其识别为 é 字符。
以下是我正在做的事情的简要说明:
1) 字符串存储在 MySQL 数据库中。 MySQL 服务器设置为: MySQL 连接排序规则 utf8_unicode_ci MySQL 字符集:UTF-8 Unicode (utf8) 数据库本身设置为 collation utf8_unicode_ci(MyISAM 存储引擎,由于共享服务器而无法更改) 实际表设置为collcation utf8_unicode_ci(InnoDB存储引擎)
é 在 phpMyAdmin 中正确显示。数据通过 Java 程序插入数据库,但我也尝试过手动输入数据(在 phpMyAdmin 中输入)。
2) PHP default_charset 未设置(无值),我在共享服务器上,手动覆盖 php.ini 似乎不起作用。使用ini_set("default_charset", 'utf-8');
有效,但对我遇到的问题没有影响。
3) 在我运行实际的选择查询之前,我查询SET NAMES 'utf8'
。查询本身无关紧要,但为了测试我选择了一个简单的SELECT title FROM items WHERE item_id = 1
4) PHP 文件本身是 UTF-8 编码的。我已经用<meta http-equiv="content-type" content="text/html; charset=utf-8" />
为html设置了正确的字符集@
5) 为了测试我在返回的字符串 (Astérix) 上使用了 htmlentities 的问题,检查了它转换为 Ast&Atilde;&copy;rix
的源代码,这当然是不正确的。因此,该字符串在浏览器中显示为Astérix
。
这可能有什么原因?对我来说,似乎我将所有可以设置为 UTF-8 的东西都设置了。
【问题讨论】:
我明确表示我在 SO 上确实对此进行了研究,但所提供的解决方案(我实际上在文中提到的大部分)都没有帮助。由于您在我发布后不到 1 分钟就阅读了实际问题,我只能假设您不假思索地回答了“另一个愚蠢的 UTF 问题,DUPE”。谢谢,非常感谢:/ 那你搜索的不够多。真的。 是的,当然,一定是这样。只需检查右侧显示的一些“相关”问题。他们甚至都没有提到多字节函数。他们都假设(通常是正确的)在某个地方的存储或检索会破坏 UTF-8 链,正如 Joe 指出的那样,这里的情况并非如此。而且我很确定您在发布无用的评论时并没有想到“哦,显然,只需使用多字节函数”,否则您只会提到这一点。 【参考方案1】:http://php.net/manual/en/ref.mbstring.php - 查看多字节字符串函数。
【讨论】:
所以你是说我从数据库中存储和检索数据没有做错,但我“只是”使用了错误的 PHP 函数来处理它? 看起来像 - 就像你说的,一切都设置为使用 UTF-8,除非你回显它时它不会被视为 UTF-8。 PHP 不会自动检测字符串的字符集(它喜欢 ISO-8859-1 :P),所以你必须帮助它,因此需要多字节函数。 我刚刚使用明确的htmlentities($string,ENT_COMPAT, "UTF-8")
htmlentities 版本进行了检查,它确实证实了您的怀疑。非常感谢:)以上是关于MySQL 数据库中字符的 UTF-8 问题(例如 é as é)的主要内容,如果未能解决你的问题,请参考以下文章