【问题标题】:ä ö character encoding, in PHP, Zend MySQL- applicationä ö 字符编码,在 PHP、Zend MySQL- 应用程序中
【发布时间】:2012-07-31 14:54:13
【问题描述】:

问题:

当我从 MySQL 表中检索值到我的 PHP Zend Framework 应用程序时,字符 ä 和 ö 会从数据库返回到我的浏览器,如下所示。

有什么想法可能会出现问题吗?我已经尝试将一些属性设置为 UTF-8,但仍然会发生这种情况......我想我仍然错过了一些东西。

您能否提供一些解决方案,我可以确定如何摆脱这种情况?我需要设置什么配置等等。

谢谢你:)

【问题讨论】:

  • 您可以发布您的Zend_DB 工厂代码吗?你确定这不是逃生问题吗?您是否设置了 Charset HTTP 标头?
  • 从中提取数据的表的排序规则是什么?确保您查看的是表而不是数据库,因为表的排序规则很容易与数据库不同。
  • 我的应用程序目前处于起步阶段,我的数据库代码非常少,到目前为止只处理连接的设置,但我会发布我使用的代码(P.S. 我是初学者,请多多包涵;D)
  • require_once(APPLICATION_PATH . "/models/Properties.php");类 Db { public static function conn() { $connProp = Properties::getProperties("database.properties"); $connParams = array("host" => $connProp['host'], "port" => $connProp['port'], "username" => $connProp['username'], "password" => $ connProp['密码'], "dbname" => $connProp['dbname']); $db = new Zend_Db_Adapter_Pdo_Mysql($connParams);返回$db; } }
  • 排序规则是 latin1_swedish_ci,如下所示:) 谢谢大家

标签: php mysql encoding utf-8 character


【解决方案1】:

当浏览器读取错误编码的字符时,它们会显示为 � 或 ?。某处编码不匹配:

  • 在您的浏览器中
  • 在数据库表排序规则中
  • 在 HTML 字符集中

这些字符可以在 Unicode UTF-8 中使用,因此您应该验证您的数据库表排序规则是 utf8_bin 或类似的,因为如果您想以 UTF-8 瑞典语存储所有内容,您可以使用 utf8_swedish_ci

在您的浏览器中,确保您的内容编码设置为自动检测。

在 MySQL 中创建一个 UTF-8 / utf8_bin 表,这里是一个例子:

CREATE TABLE `sample` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

要更改现有表以使用 UTF-8,请使用以下命令:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

This post对是否使用CONVERT TO CHRACTER SET utf8有很好的解释

注意CHARSETCOLLATE都必须设置,否则会自动得到COLLATE=utf8_general_ci

对于 HTML,可以使用以下方式设置字符集:

<meta charset="UTF-8">

【讨论】:

  • 谢谢大家的回答,我会看看哪一个有帮助并发布结果;)
  • 一个常见的问题是表格字符集和排序规则位于 cp1252 (latin1) 和 latin1_general_ci
【解决方案2】:

我建议你看看你在浏览器中设置的“网站编码”。

如果网站不提供编码并且您的 mysql/php 正在“正确”处理它,则可能会发生这种情况(例如,它设置为“western 1252”但需要 utf8/unicode)

在 Firefox 中,您可以通过视图 -> 编码(或类似方式)查看编码

【讨论】:

    【解决方案3】:

    关于 Zend_Db_Adapter_Pdo_Mysql 确保您的构造函数使用 UTF-8,如下所示:

    $your_pdo = Zend_Db::factory('Pdo_Mysql', array(
                    'host'     => DATABASE_HOST,
                    'username' => DATABASE_USERNAME,
                    'password' => DATABASE_PASSWORD,
                    'dbname'   => DATABASE_DBNAME,
                    'options'  => array( 'charset' => 'utf8' )
            ) );    
    

    HTML 中使用数据之前将其转义:

    return htmlspecialchars( $string, ENT_QUOTES, 'UTF-8' );
    

    查看有关内容类型、文件编码等的所有其他答案。

    【讨论】:

      【解决方案4】:

      您只需将编码正确设置为 UTF-8。以下是最小工作解决方案的基本步骤:

      1. 确保您的DB connection uses UTF-8
      2. 确保您的 HTTP 内容类型设置为 UTF-8(例如:header('Content-type: text/html; charset=utf-8');(也可以指定编码 for your document
      3. 将文件保存为 UTF-8。在 Windows 中,文件保存为 CP-1251,这意味着特殊重音字符不会被视为 UTF-8 编码字节(因此会丢弃输出到浏览器的内容。保存文件时必须明确设置编码。在 Linux/Mac 中,这不是问题,因为默认使用 UTF-8。
      4. 确保您的php.ini 没有覆盖编码。如果您有外部的 .htaccess 文件,请检查它们是否也没有。

      如果您正确处理 UTF-8,则不需要utf8_encode/utf8_decodehtmlentities 等,并且无需特殊处理即可正确输出重音字符。

      注意:有些语言环境不是由 UTF-8 处理的,尤其是 Thaï

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-22
        • 2011-07-28
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        相关资源
        最近更新 更多