7 回答
确保您的 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 编码。这真的很糟糕;这与标头可以修复的简单编码不匹配无关。您的数据实际上已损坏。
如果数据库中的数据正常(检查SELECT hex(column) FROM myTable)
以查看它是否已经在数据库中进行了双重编码),那么您的代码必须在输出时将其转换为 UTF-8。
在您的项目中搜索 function utf8_encode
,convert_to_utf8
或 just iconv
or的用法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
简而言之,您必须转储您的表,在表上使用相同的编码集(以避免重新编码),将该转储备份到安全的地方,然后更改表定义以反映实际编码,然后将其加载回来。
经过2天的努力,终于解决了这个问题。感谢@yourcommonsense、@robsquires 和我的一个工作朋友提供帮助调试问题的好资源。
问题是在将 sql 文件转储到数据库(导入)时,服务器、数据库、客户端和连接的字符集被设置为latin1
(status
命令有助于解决这个问题)。所以命令行也设置latin1
为,这就是它显示正确字符的原因,但与 PHP 代码的连接是 UTF8,它试图再次对其进行编码。以双重编码结束。
解决方案:
mysqldump
表格和数据(在 中latin1
)- 转储数据库
/etc/my.cnf
如 Rob Squires 所述,将默认字符集设置为 UTF8- 重启mysql
- 使用正确的字符集和排序规则再次创建数据库
- 将文件转储回其中
它工作正常。
感谢大家的贡献!
mysql_set_charset('utf8')
mysql连接后试试 。然后它应该工作。
可能这也可能是由于未安装 mbstring 扩展(这将解释您的开发环境和生产环境之间的差异)
看看这篇文章,也许会给你更多的答案。