【问题标题】:Character Encoding Mismatch字符编码不匹配
【发布时间】:2010-07-01 23:28:50
【问题描述】:

我的脚本绝对是以 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 输出它,就会显示 �。

我的问题是,这种差异是从哪里产生的,是否有可能让我的网页和数据库工具都能完美运行?

【问题讨论】:

  • 奇怪,听起来你做的一切都是对的。您是否 1000% 确定您的数据库连接是 UTF-8?您可以发送SET NAMES utf8; 查询以确认一下吗?
  • 您的浏览器是否忽略了编码?该字符集是建议性的,如果您已将其配置为这样做,浏览器将忽略它。不同浏览器中的行为是否相同?在不同的机器上?
  • 为了更好地衡量,请确保您的 PHP 脚本配置为使用 UTF-8。如果 PHP 正在执行即时字符转换,因为它认为文件需要使用另一个 ISO 字符表,这可能解释了您所看到的情况。 ini_set('default_charset', 'UTF-8');

标签: php mysql character-encoding mojibake


【解决方案1】:

DSN 中的字符集指令实际上适用于 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'"));

【讨论】:

    【解决方案2】:

    简单地说,将 € 转换为 html 实体 €对于超标(但您可能会遇到其他特殊字符的问题)

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

    另外,重要的是要注意 meta equiv 没有区别,您需要始终设置 header('Content-Type: ...)

    【讨论】:

      【解决方案3】:

      由于您的 HTML 页面是正确的,看来您在数据库中存储了正确的数据。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-19
        • 2014-05-03
        相关资源
        最近更新 更多