数据库中的UTF8字符不能在浏览器中正确显示- MySQL &PHP CodeIgniter


UTF8 characters from database don't show up properly in the browser - MySQL & PHP CodeIgniter

我的数据库和表设置为utf8_general_ci排序规则和utf8字符集。CodeIgniter设置为utf8。我已经添加了元标签charset=utf8,我仍然得到这样的东西:квартиры而不是西里尔字母…

同样的代码运行在本地机器上工作良好- Mac OSX。它只在生产机器中出现问题,即AWS EC2中的Ubuntu 11.10 64位。来自.php文件的静态内容显示正确,只有来自数据库的数据是混乱的。示例页面:http://dev.uzlist.com/browse/cat/nkv

知道为什么吗?

谢谢。

供参考:当我做error_log()数据来自数据库,它是相同的值,我在页面上看到的。因此,这不是浏览器-服务器问题。它介于mysql和php之间,因为当我运行SELECT * FROM categories时,它以正确的格式显示数据。我使用PHP CodeIgniter框架进行数据库连接和查询,如前所述,我已将其配置为使用utf8连接和utf8_general_ci排序。

确保您的my.cnf(可能在/etc/中)有以下条目:

[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
[client]
default-character-set=utf8

你需要重新启动mysql服务,一旦你做了你的更改。

在这里添加我的注释,使这一点更清楚。

确保设置了以下HTTP报头,以便浏览器知道预期的字符集。

Content-type: text/html; charset=UTF-8

也试着把这个标签添加到你的html <head>标签的顶部

<meta http-equiv="Content-type" value="text/html; charset=UTF-8" />

使浏览器正确显示。你应该检查三点:

  1. 连接编码
  2. 数据库或表模式的编码。

如果所有这些都是兼容的,你就会得到你想要的页面。

原始数据已编码为UTF-8,结果在Windows-1252中解释,然后再次编码为UTF-8。这真的很糟糕;这不是一个简单的编码不匹配的问题,标头可以修复。你的数据实际上是坏的。

如果数据在数据库中是ok的(检查SELECT hex(column) FROM myTable),看看它是否已经在数据库中被双编码),那么必须有你的代码在输出时将其转换为UTF-8。

在您的项目中搜索函数utf8_encode, convert_to_utf8或仅iconvmb_convert_encoding的使用。运行

$ grep -rn "'(utf8_'(en'|de')code'|convert_to_utf8'|iconv'|mb_convert_encoding')" .

在你的应用程序的/application文件夹应该足够找到一些东西。

请参见配置值:

<?php
var_dump(
    ini_get( "mbstring.http_output" ),
    ini_get( "mbstring.encoding_translation" )
);

好吧,如果你绝对肯定你的mysql客户端编码设置为utf8,有两种可能的情况。单-双编码-由Esailija描述。

但是还有另一个:你的数据实际上是用1251编码的,而不是用utf-8。在这种情况下,您必须重新编码数据或在表上设置适当的编码。虽然它不是一个按钮按任务
这里有一个专门针对这种情况的手册(俄语):http://phpfaq.ru/charset#repair

简而言之,您必须转储表,在表上使用相同的编码集(以避免重新编码),将转储备份到安全的地方,然后更改表定义以反映实际编码,然后将其加载回来。

这也可能是由于没有安装mbstring扩展(这可以解释开发环境和生产环境之间的差异)

看看这篇文章,可能会给你更多的答案。

在mysql连接后尝试mysql_set_charset('utf8')。那么它应该会起作用。

经过2天的努力,终于解决了这个问题。感谢@yourcommonsense, @robsquires,以及我工作中的一个朋友提供的帮助调试问题的良好资源。

问题是,在将sql文件转储到数据库(导入)时,服务器、数据库、客户端和连接的字符集设置为latin1 (status命令帮助确定了这一点)。所以命令行也被设置为latin1,这就是为什么它显示正确的字符,但是与PHP代码的连接是UTF8,并且它试图再次编码它。以双编码结束。

<<p> 解决方案/strong>:
  1. mysqldump的表和数据(而在latin1)
  2. 转储数据库
  3. /etc/my.cnf中的默认字符集设置为UTF8,如Rob Squires提到的
  4. 重启mysql
  5. 用正确的字符集和排序规则重新创建数据库
  6. 将文件转储回

效果很好。

感谢大家的贡献!