我的数据库和表设置为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" />
使浏览器正确显示。你应该检查三点:
- 连接编码 数据库或表模式的编码。
如果所有这些都是兼容的,你就会得到你想要的页面。
原始数据已编码为UTF-8,结果在Windows-1252中解释,然后再次编码为UTF-8。这真的很糟糕;这不是一个简单的编码不匹配的问题,标头可以修复。你的数据实际上是坏的。
如果数据在数据库中是ok的(检查SELECT hex(column) FROM myTable)
,看看它是否已经在数据库中被双编码),那么必须有你的代码在输出时将其转换为UTF-8。
在您的项目中搜索函数utf8_encode
, convert_to_utf8
或仅iconv
或mb_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,并且它试图再次编码它。以双编码结束。
-
mysqldump
的表和数据(而在latin1
) - 转储数据库
- 将
/etc/my.cnf
中的默认字符集设置为UTF8,如Rob Squires提到的 重启mysql - 用正确的字符集和排序规则重新创建数据库
- 将文件转储回
效果很好。
感谢大家的贡献!