字符编码不匹配

时间:2010-07-01 23:28:51

标签: php mysql character-encoding mojibake

我的脚本肯定以UTF-8保存。我用"{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8"实例化PDO。我的表使用InnoDB,并使用utf8_general_ci进行整理。我的网页会以Content-Type: text/html; charset=UTF-8标题或<meta>等效标题发送。

当使用PDO存储源自HTTP输入或源代码中的字符串文字的€字符时,根据MySQL Workbench 5.2,我留下了c3 a2 e2 80 9a c2 ac。从数据库中检索并在页面上显示它可以正常工作。然而在phpMyAdmin和Workbench中,我看到€

当使用这两个工具来存储€时,我留下了e2 82 ac,这显然是正确的UTF-8表示,但如果我尝试检索然后用PHP输出,则会显示

我的问题是,这种差异从何处出现,是否可以使我的网页和数据库工具完美运行?

3 个答案:

答案 0 :(得分:1)

DSN中的charset指令实际上适用于MSSQL。我只需要执行SET NAMES。对不起。

我实现了这一点:

parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
                    $this->user, $this->password,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));

答案 1 :(得分:0)

简单地说,将€转换为html实体和欧元;对于超级修复(但你可能会遇到其他特殊字符的问题)

问题的另一面(更具体地说)是检查mysql character_set_server和最常见原因character_set_client - 请参阅:connection charsets

另外,重要的是要注意meta equiv没有区别,你需要总是设置标题('Content-Type:...)

答案 2 :(得分:0)

由于您的HTML页面正确,您似乎正在将正确的数据存储在数据库中。

€是欧元符号的UTF-8编码被误解为windows-1252。您的Windows工具似乎使用“ANSI”编码而不是数据库编码。