数据库中的UTF8字符无法在浏览器中正确显示 - MySQL和PHP CodeIgniter

我的数据库和表格设置为 utf8_general_ci </ code>整理和 utf8 </ code > charset。 CodeIgniter设置为 utf8 </ code>。 我添加了元标记 charset = utf8 </ code>,我仍然得到类似的东西:кварÑ,ирÑ<< / code>而不是西里尔字母。 .. </ p>

在本地计算机上运行的相同代码运行良好 - Mac OSX。 它只是在生产机器中破解,这是AWS EC2中的Ubuntu 11.10 64位。 来自 .php </ code>文件的静态内容正确显示,只有来自数据库的数据被搞砸了。 示例页面: http://dev.uzlist.com/browse/cat/nkv < / p>

任何想法为什么?</ p>

谢谢。</ p>

FYI </ strong>:
当我 do error_log()</ code>来自数据库的数据,它与我在页面上看到的值相同。 因此,它不是浏览器服务器问题。 它是mysql和php之间的东西,因为当我运行 SELECT * FROM categories </ code>时,它会以正确的格式显示数据。 我正在使用PHP CodeIgniter框架进行数据库连接和查询,如上所述此处</ a >,我已将其配置为使用utf8连接和 utf8_general_ci </ code>排序规则。</ p>
</ div>

展开原文

原文

My database and tables are set to utf8_general_ci collation and utf8 charset. CodeIgniter is set to utf8. I've added meta tag charset=utf8, and I'm still getting something like: квартиры instead of cyrillic letters...

The same code running on the local machine works fine - Mac OSX. It's only breaking in the production machine, which is Ubuntu 11.10 64bit in AWS EC2. Static content from the .php files show up correctly, only the data coming from the database are messed up. Example page: http://dev.uzlist.com/browse/cat/nkv

Any ideas why?

Thanks.

FYI: When I do error_log() the data coming from the database, it's the same values I'm seeing on the page. Hence, it's not the browser-server issue. It's something between mysql and php, since when I run SELECT * FROM categories, it shows the data in the right format. I'm using PHP CodeIgniter framework for database connection and query and as mentioned here, I have configured it to use utf8 connection and utf8_general_ci collation.

duan3601
duan3601 我从命令行访问它,选择查询给我正确的字符。
7 年多之前 回复
duancaiyi7567
duancaiyi7567 也许你从本地服务器转移到远程服务器时打破了它?你有像phpmyadmin这样的东西在遥控器上运行,它看起来在那里吗?
7 年多之前 回复
dri98076
dri98076 没有帮助
7 年多之前 回复
dszm02606009
dszm02606009 $this->db->query('SETNAMESutf8');在你选择之前-值得一试
7 年多之前 回复
duanjingsen7904
duanjingsen7904 整个代码中有很多插入语句,但是...Codeigniter数据库配置:ellislab.com/codeigniter/user-guide/database/configuration.html
7 年多之前 回复
dougui5419
dougui5419 不知道codeigniter类是如何工作的,但是你仍然可以在select之前发出上面的查询。
7 年多之前 回复
drnpwmq4536
drnpwmq4536 我正在使用CodeIgniter框架提供的db类。在配置中,它设置为utf8charset和utf8_general_cicollat​​ion
7 年多之前 回复
doumu5023
doumu5023 是使用utf8的数据库连接?mysql_query('SETNAMESutf8');
7 年多之前 回复

7个回答



经过2天的斗争,最终找到了问题。 感谢@yourcommonsense,@ robsquires和我的一位朋友在工作中寻找有助于调试问题的良好资源。</ p>

问题是在sql文件转储到 数据库(导入),服务器,数据库,客户端和连接的charset设置为 latin1 </ code>( status </ code>命令帮助解决了这个问题)。 所以命令行也被设置为 latin1 </ code>,这就是它显示正确字符的原因,但是与PHP代码的连接是UTF8并且它试图再次编码它。 结束了双重编码。</ p>

解决方案</ strong>:</ p>


  1. mysqldump </ code> 表和数据(在 latin1 </ code>中)</ li>
  2. 转储数据库</ li>
  3. / etc中将默认字符集设置为UTF8 /my.cnf </ code>正如Rob Squires提到的那样</ li>
  4. 重新启动mysql </ li>
  5. 使用正确的字符集和整理再次创建数据库</ li>
    < li>将文件转储回来</ li>
    </ ol>

    它运行正常。</ p>

    谢谢大家的贡献!</ p>

    </ div>

展开原文

原文

After 2 days of fighting this bug, finally figured out the issue. Thanks for @yourcommonsense, @robsquires, and a friend of mine from work for good resources that helped to debug the issue.

The issue was that at the time of the sql file dump to the database (import), charset for server, database, client, and connection was set to latin1 (status command helped to figure that out). So the command line was set to latin1 as well, which is why it was showing the right characters, but the connection with the PHP code was UTF8 and it was trying to encode it again. Ended up with double encoding.

Solution:

  1. mysqldump the tables and the data (while in latin1)
  2. dump the database
  3. set the default charsets to UTF8 in /etc/my.cnf as Rob Squires mentioned
  4. restart the mysql
  5. create the database again with the right charset and collation
  6. dump the file back into it

And it works fine.

Thanks all for contribution!



为了使浏览器正确显示,你应该检查三点:</ p>


    < li>脚本文件的编码。</ li>
  1. 连接编码。</ li>
  2. 数据库或表模式的编码。</ li>
    </ ol>
    \ n

    如果所有这些都兼容,您将获得所需的页面。</ p>
    </ div>

展开原文

原文

To make the browser show up correctly.you should check three points:

  1. encoding of your script file.
  2. encoding of connection.
  3. encoding of database or table schema.

if all of these are compatible, you'll get the page you want.

dth54864
dth54864 脚本文件是utf8编码的,连接(标题)设置为utf8,其中的数据库和表是utf8_general_ci,并且字符集设置为utf8。 还有其他想法吗?
7 年多之前 回复



确保my.cnf(可能在/ etc /中)包含以下条目:</ p>

  [mysqld] 
default-character-set = utf8
default-collat​​ion = utf8_general_ci
character-set-server = utf8
collat​​ion-server = utf8_general_ci
init-connect ='SET NAMES utf8'
\ n [client]
default-character-set = utf8
</ code> </ pre>

进行更改后,您需要重新启动mysql服务。</ p>

在此处添加我的注释以使其更清晰。</ strong> </ p>

确保设置了以下HTTP标头,以便浏览器知道什么是字符集 期待。</ p>

  Content-type:text / html;  charset = UTF-8 
</ code> </ pre>

还可以尝试将此标记添加到html &lt; head&gt; </ code>标记的顶部</ p> \ n

 &lt; meta http-equiv =“Content-type”value =“text / html; charset = UTF-8”/&gt; 
</ code> </ pre>
< / DIV>

展开原文

原文

Make sure your my.cnf (likely to be in /etc/) has the following entries :

[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

You'll need to restart the mysql service once you make your changes.

Adding my comments in here to make this a little clearer.

Make sure the following HTTP header is being set so the browser knows what charset to expect.

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

Also try adding this tag into the top of your html <head> tag

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

drvxnivoqf17568697
drvxnivoqf17568697 是的我可以在标题中看到它们:i.imgur.com/AeHXj.png?1
7 年多之前 回复
drll85318
drll85318 同时删除附加的'<meta charset =“utf-8”>'标签,并将推荐的标签移到头下
7 年多之前 回复
duanbei6427
duanbei6427 您没有设置HTTP标头,只能看到'Content-Type:text / html'
7 年多之前 回复
dsfdsf21312
dsfdsf21312 我添加了同样的问题。 可能是因为gzipping?
7 年多之前 回复
duanhuancong1969
duanhuancong1969 另外尝试在你的html标题中添加这个元标记<meta http-equiv =“Content-type”value =“text / html; charset = UTF-8”/>
7 年多之前 回复
dotelauv682684
dotelauv682684 看起来你的http标头设置不正确内容类型:text / html; 字符集= UTF-8
7 年多之前 回复
dtyw10299
dtyw10299 做了改动 - >重启mysql - >同样的问题
7 年多之前 回复



原始数据已编码为UTF-8,结果在Windows-1252中解释,然后再次进行UTF-8编码。 这真的很糟糕; 它不是关于标头会修复的简单编码不匹配。 您的数据实际上已损坏。</ p>

如果数据库中的数据正常(使用 SELECT hex(column)FROM myTable)</ code>检查它是否是双重编码的 已经在数据库中),那么必须有你的代码在输出时将其转换为UTF-8。 </ p>

在项目中搜索函数 utf8_encode </ code>, convert_to_utf8 </ code>或 iconv </ code>或的用法 mb_convert_encoding </代码>。 正在运行</ p>

  $ grep -rn“\(utf8 _ \(en \ | de \)code \ | convert_to_utf8 \ | iconv \ | mb_convert_encoding \)”。
</ code > </ pre>

在应用程序的/ application文件夹中应该足以找到一些东西。</ p>

另请参阅以下配置值:</ p>
\ n

 &lt;?php 
var_dump(
ini_get(“mbstring.http_output”),
ini_get(“mbstring.encoding_translation”)
);
</ code> </ pre> \ n </ div>

展开原文

原文

The original data has been encoded as UTF-8, the result interpreted in Windows-1252 and then UTF-8 encoded again. This is really bad; it isn't about a simple encoding mismatch that a header would fix. Your data is actually broken.

If the data is ok in the database (check with SELECT hex(column) FROM myTable) to see if it was double encoded already in the database), then there must be your code that is converting it to UTF-8 on output.

Search your project for uses of function utf8_encode, convert_to_utf8, or just iconv or mb_convert_encoding. Running

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

On your application's /application folder should be enough to find something.

Also see config values for these:

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



好吧,如果你绝对肯定你的mysql客户端编码设置为 utf8 </ code>,那么有2个 可能的情况。 一次双重编码 - 由Esailija描述。</ p>

但还有另外一种:你的数据实际编码在1251,而不是utf-8。
在这种情况下,你必须重新编码 您的数据或在表上设置正确的编码。 虽然它不是一个按钮推送任务

这是一个手册(俄语)显然为该案例: http: //phpfaq.ru/charset#repair </ p>

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

展开原文

原文

Well, if you absolutely and positively sure that your mysql client encoding is set to utf8, there are 2 possible cases. One - double encoding - described by Esailija.

But there is another one: you have your data actually encoded in 1251, not in utf-8. In this case you have to either recode your data or set proper encoding on the tables. Though it is not one button push task
Here is a manual (in russian) exаctly for that case: http://phpfaq.ru/charset#repair

In short, you have to dump your table, using the same encoding set on the table (to avoid recoding), backup that dump in safe place, then change table definitions to reflect the actual encoding and then load it back.

douqiao8370
douqiao8370 我还没有尝试Esailija的建议,但是我试图转储整个数据库,用utf8字符集和utf8_general_ci整理创建一个新的数据库,然后双重检查我导入的sql文件是utf8编码的,里面的字符是正确的, 并导入它。 例如,当我执行SELECT * FROM类别时,在mysql命令行中,它正确地显示了内容,但是当我使用PHP CodeIgniter做同样的事情时,它给了我奇怪的东西。 最近我和Ubuntu有类似的设置,它工作正常。 有什么我可能错过安装?
7 年多之前 回复



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

看看这个发布,可能会给你一些答案。</ p>
</ div>

展开原文

原文

Potentially this may also be caused by the mbstring extension not being installed (which would explain a difference between your dev and production environments)

Check out this post, might give you a few more answers.

duanbo7517
duanbo7517 对不起,这只是误导,良好的链接
7 年多之前 回复



在mysql连接后尝试 mysql_set_charset('utf8')</ code>。 然后它应该工作。 </ p>
</ div>

展开原文

原文

Try mysql_set_charset('utf8') after the mysql connect. Then it should works.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问