字符编码问题

时间:2009-12-18 07:22:37

标签: php mysql character-encoding

我需要将它保存到数据库(mysql)并显示回来。 (我的数据库是utf_general_ci)

我αalivisvisłєłiкєαiя--- 我αмαsiмρøяŧαиŧαsøxygєи--- 我是αi iŧЋєŧЋєŧЋємммммм 我αααłwαysŧЋєяєєøЋєłρøŧЋєяz--- 我在这里忙碌着ŧєєєєєє 我αмŧЋєøєєwЋøcαяєz--- 我łøvєŧøsєєøŧЋєяłαugЋiиg 我αмŧЋєøєєwЋøbøяяøwøŧЋєяzsøяяøw 我αøŧЋєøєєwЋøzиαugЋŧybuŧиicє 我αмłøsŧiимyŧЋøugЋŧs--- 我łøvєŧøŧαłк--- 我łøvєєøsЋαяє--- 我αмяєαdyŧøgøαиywЋєяє--- 我łøvєŧøƒłybuŧdøи'ŧЋαvєwiиgs- 我知道ŧøøøøЋЋŧЋєsкyłiмiŧs--- 我αмєviłbuŧиøŧdєvił--- 我єєvєяƒøłłøwαиyŧяєиd--- 我αмƒuиłøviиg--- suмŧiмєłøvєєøbєαłøиє--- 我łøvєŧøłivє---

但是,在保存和检索数据时,这就是我得到的

â��â�¥Ã ±LLø¸£Ãïï½½ïïï½½½½½½ï¿好不¥Â¢ï¿½ï¿½ â�ï&安培; iqu

请帮忙吗?是否可以更改数据库的排序规则或某些可以处理此问题的PHP函数?

5 个答案:

答案 0 :(得分:9)

您需要使用'SET NAMES utf8'来确保您的服务器使用UTF-8字符集发回结果。例如:

$dbconn = mysql_connect("localhost", "user", "pass") or die(mysql_error());
           mysql_select_db('database', $dbconn) or die(mysql_error());
           mysql_query("SET NAMES 'utf8'");

答案 1 :(得分:5)

我必须指出你对乔尔的文章The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。本文解释了什么是字符编码,为什么使用它们以及如何管理它们。

您的数据显然包含了大量的Unicode字符,因此您必须了解PHP和MySql如何处理字符编码(在您的配置中)以及要调用哪些函数以确保编码已翻译在正确的时间正确。您粘贴的样本(不正确)数据表明某处肯定存在编码不匹配。

答案 2 :(得分:4)

请尝试以下步骤:

  1. 确保所有数据库字段都设置为存储UTF-8数据(utf8_general_ci)。
  2. 连接到数据库后,执行以下查询:SET NAMES 'utf8';
  3. 将.php文件保存为 UTF-8无BOM there is a nice free text editor for Windows,以便您轻松更改(在状态栏上)文件的编码,只需选择 UTF-8 Plain
  4. 这应该有效,但是如果你从用户那里收到数据(通过GET,POST或COOKIE参数),你可能想要关注一些additional steps described in this answer

    另外,关于以下元标记:

    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    

    或等效的PHP标题:

    header('Content-Type: text/html; charset=utf-8');
    

    您只需要那些显示 UTF-8数据,它不会干扰存储过程,当然,使用它并不会有害。 =)

答案 3 :(得分:1)

确保运行MySQL mysql_query("SET NAMES 'utf8'");进行数据传输,然后确保每个页面都发送UTF-8标头。

header('Content-Type: text/html; charset=utf-8');

另外,请阅读Am I correctly Supporting UTF-8以仔细检查所有内容并通过它运行一些other test data以确保其有效。并且每个页面加载can test for UTF-8

最后,请确保浏览器安装了您要使用的字符集,因为某些新功能(如Chrome)不会自动使用某些字符集。但是,它们都使用UTF-8,因此请确保发送该标题!

答案 4 :(得分:1)

要使用没有编码问题的特殊字符,请尝试遵循以下4条规则:

  1. 使用utf8_general_ci collat​​ion
  2. 在db上创建字段
  3. 进行查询mysql_query(“SET NAMES'utf8';”);任何连接后(你需要mysql 5)
  4. 在html head block中放置meta charset utf8标记
  5. 在不使用utf8_encode或其他功能的情况下读取和写入字符串到db和html
  6. 此文字来自here