【问题标题】:How to set charset to UTF-8 in a Zend application?如何在 Zend 应用程序中将字符集设置为 UTF-8?
【发布时间】:2011-06-08 08:31:28
【问题描述】:

我正在开发 Zend 应用程序。我数据库中的数据以“utf8_unicode_ci”编码。 我在 application.ini 中声明:

resources.view.encoding = "UTF-8"

但是每当我尝试检索包含特殊字符的字符串时,例如

{'é', 'à', 'è',...} 在数据库中,除非我使用该函数,否则字符串不会显示:utf8_decode()

所以我尝试将字符集设置为 UTF-8 :

引导:

protected function _initDoctype() {
      $this->bootstrap('view');
      $view = $this->getResource('view');
      $view->doctype('XHTML_STRICT');
      $view->setEncoding('UTF-8');
 }

 protected function _initFrontControllerOutput() {

    $this->bootstrap('FrontController');
    $frontController = $this->getResource('FrontController');

    $response = new Zend_Controller_Response_Http;
    $response->setHeader('Content-Type', 'text/html; charset=UTF-8', true);
    $frontController->setResponse($response);

    $frontController->setParam('useDefaultControllerAlways', false);

    return $frontController;
}

布局:

$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf8');
echo $this->headMeta();

应用程序.ini:

resources.view.encoding = "UTF-8"
resources.db.params.charset = "utf8"

编辑:现在我可以在页面中显示特殊字符,但是当我从数据库中检索元素时,不显示特殊字符。

  • 转义字符串返回null ($this->escape($string))
  • echo $string? 替换特殊字符

所以我仍然必须使用utf8_decode() 来显示它们。有什么建议吗?

感谢您的帮助!!

【问题讨论】:

  • 顺便说一下,我的源文件编码设置为utf-8

标签: database zend-framework utf-8 character-encoding


【解决方案1】:

您是否设置了以下内容以从 MySQL 获取数据为 utf8?

resources.db.params.charset = "utf8"

需要做三件事才能正确显示正确的字符:

  1. 以 utf8 编码保存 PHP/HTML 文件
  2. 以 utf8 格式从 MySQL 获取数据
  3. 发送正确的内容类型/字符集标题或使用元标记

Rob Allen's article 中的更多信息。

【讨论】:

  • 确实我没有在配置文件中添加这个资源。现在我的整个应用程序设置为 UTF-8,但是虽然我添加了 codeheader("Content-type: text/html; charset=utf-8");code 没有出现在我显示页面时的源代码
  • header 和 meta 是两个不同的东西。要在您的 html 中获取元数据,您需要添加 echo $this->headMeta();在你的布局脚本中。
  • 您可以设置标题(或让 Apache 为您设置)或添加元标记,如 Maxence 所述。您不需要同时使用标头和元标记,但它不会受到伤害,元标记将用作备份。
【解决方案2】:

我在 Zend Framework 2 应用程序中使用 Doctrine2 模块时遇到了同样的问题。为我的 Doctrine2 模块显式设置字符集解决了这个问题...

只需将'charset' => 'utf8' 添加到您的学说连接参数中:

'params' => array(
    'host'     => 'localhost',
    'port'     => 'yourport',
    'user'     => 'username',
    'password' => 'password',
    'dbname'   => 'yourdatabase',
    'charset'  => 'utf8',
)

可能也适用于您的正常数据库连接。在连接字符串中添加'charset=utf8'

'db' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:host=$localhost;dbname=$yourdatabase;charset=utf8',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    )
),

【讨论】:

  • 在 dsn 上添加 charset=utf8 和在 params 处添加 'charset' => 'utf8' 对我有用。最佳答案!谢谢!
【解决方案3】:

您是否尝试过将标头也设置为 utf8?通常在 php 中我是这样做的

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

在你的情况下,我认为你必须使用不同的东西。我从Zend Framework documentation 中获取了这个例子,也许你应该使用不同的东西,我不是 Zend_Framework 的专家

// Within an action controller action:
// Set a header
$this->getResponse()
    ->setHeader('Content-Type', 'text/html')
    ->appendBody($content);

如果您设置了标头、元和编码,它应该可以工作(从您的代码看来,您只是在设置元和编码)

(看看这个问题就明白我的意思了,Berry Langerak 的回答:PHP Display Special Characters

编辑 - 我还在本文中找到了另一个示例,它为控制器设置标题,看看它,也许这就是你要找的:http://www.chris.lu/en/news/show/4d56d0ecb058c/

这部分可能是您正在寻找的:

protected function _initFrontControllerOutput() {

    $this->bootstrap('FrontController');
    $frontController = $this->getResource('FrontController');

    $response = new Zend_Controller_Response_Http;
    $response->setHeader('Content-Type', 'text/html; charset=UTF-8', true);
    $frontController->setResponse($response);

    $frontController->setParam('useDefaultControllerAlways', false);

    return $frontController;

}

【讨论】:

  • 我已经在布局文件中使用这一行将标题设置为 utf8:this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf8') ;但我也试过你的函数头,返回“Header() 期望参数 3 很长,字符串在....
  • 感谢您的链接 (chris.lu),但我尝试将这个函数放入我的引导程序中,但它并没有改变任何东西
  • 不,我认为使用该行只设置“元”:这意味着 html 中的 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">。如果您看到我链接的另一个问题,他们设置了元数据和标题,但我不知道如何在 Zend 中设置标题
  • 这个答案很好,但是以这种方式设置响应会破坏 PHPUnit 中的单元测试
【解决方案4】:

也许您应该尝试编辑源文件,将 UTF-8 作为编辑器的编码。有时即使您在 HTML 标头、数据库编码等中使用 UTF-8,如果您的源文件采用不同的编码,这也可能导致此类错误。

【讨论】:

  • 我所有的源文件都用UTF-8编码,但是虽然我设置了标题,但是当我显示一些页面时,它们都没有在标题中包含charset标签
  • 会不会是您的浏览器缓存造成的?例如,谷歌浏览器的缓存功能非常强大,如果你在网页视图中开发时不不断清除缓存,你可能会遇到这个问题。我不确定这是否也发生在 firefox 中,我使用 firebug 并一直禁用缓存。
  • 这个问题我已经解决了,确实是数据库和浏览器缓存问题
【解决方案5】:

正如其他人所说,我们必须设置编码,在我的 Zend 框架中,我必须以稍微不同的方式进行设置:

  1. 在 db.ini 文件中:

charset = "utf8"

adapter = PDO_MYSQL
dbname = skydevel_skydevfinal
username = root
password = 
hostname = localhost
sprofiler = false
charset = "utf8"

在声明数据库、用户名等的下面添加这一行。

2.现在在 bootstrap.php 文件中指向该新行的引用:

'charset'=>$dbConfig->charset

end_Db::factory($dbConfig->adapter, array('host' => $dbConfig->host,
                'username' => $dbConfig->username,
                'password' => $dbConfig->password,
                'dbname' => $dbConfig->dbname,
                'charset'=>$dbConfig->charset
  1. 您必须将数据库和表设置为 UTF-8,这是我的做法: ALTER DATABASE skydevel_skydevfinal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE ch_news_comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

【讨论】:

    【解决方案6】:

    如果您需要使用 utf8_encode() 这意味着您的数据库中的数据不是以 UTF8 编码的。 当您说您的数据库以“utf8_unicode_ci”编码时,实际上并不意味着您的数据以 UTF8 编码。

    要使用您展示的任何代码来验证集编码是否与 Zend Framework 一起使用,这非常容易。使用 firefox 只需右键单击页面并单击“查看页面信息”,如果显示“编码:UTF8”,则表示您的页面已正确编码,但您的数据未正确编码。

    如果您使用的是 utf8_decode(),那么这意味着 Zend 无法设置编码。

    【讨论】:

    • 对不起,我犯了一个错误我使用 utf8_decode() 显示数据,但是,当我检查页面信息时,字符集设置为 UTF-8
    • 这绝对是真的很奇怪... utf8_decode() 解码为 ISO-8859-1
    【解决方案7】:

    如果您将所有编码和整理(例如 'utf8_general_ci')放在 BD 中,然后在 mysql 连接参数旁边的 application.ini 中,resources.db.params.charset = "utf8" 应该可以解决问题。

    【讨论】:

      【解决方案8】:

      我遇到了同样的问题,我在 config/autoload/global.php 中修复了它 通过设置字符集值:

      'db' => [
          'adapters' => [
              'dummy' => [],
              'myadapter' => ['charset'  => 'utf-8',],
          ],
      

      【讨论】:

        【解决方案9】:

        我曾经用包括 RTL 在内的多种语言开发 ZF 应用程序。 我曾经将它添加到我的引导文件中,我发现它非常整洁。

        也许这不是一个答案,但我认为这是个好建议

        public function _initMB(){
         mb_internal_encoding("UTF-8");
        }
        

        有关mb_internal_string的更多信息,请查看:http://php.net/manual/en/function.mb-internal-encoding.php

        【讨论】:

        • 谢谢,我加了这个功能,但是好像也不起作用
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多