如何在Zend应用程序中将charset设置为UTF-8?

时间:2011-06-08 08:31:29

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

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

resources.view.encoding = "UTF-8"

但每当我尝试检索包含特殊字符(如

)的字符串时 数据库中的

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

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

Bootstrap:

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();

application.ini:

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

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

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

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

感谢您的帮助!!

9 个答案:

答案 0 :(得分:16)

您是否设置了以下内容,以便以utf8的形式从MySQL获取数据?

resources.db.params.charset = "utf8"

为了正确显示正确的字符,有必要做三件事:

  1. 以utf8编码保存PHP / HTML文件
  2. 以utf8
  3. 从MySQL获取数据
  4. 发送正确的content-type / charset标头或使用元标记
  5. Rob Allen's article中的更多信息。

答案 1 :(得分:7)

在我的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\''
    )
),

答案 2 :(得分: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;

}

答案 3 :(得分:1)

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

答案 4 :(得分:1)

就像其他人说的那样,我们必须设置编码,在我的Zend框架中,我必须以一点不同的方式来进行编码:

  1. 在db.ini文件中:

字符集=“ utf8”

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

在声明数据库,用户名等的位置下方添加此行。

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

'字符集'=> $ dbConfig->字符集

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;

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

如果你把所有的编码和整理(如'utf8_general_ci')放在BD中,然后再放在application.ini中,只需要接下来的mysql连接参数,resources.db.params.charset = "utf8"就可以了。

答案 7 :(得分:0)

我有同样的问题,我在config / autoload / global.php中修复了它 通过设置charset值:

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

答案 8 :(得分:-2)

我曾经用许多语言开发ZF应用程序,包括RTL语言。 我曾经把它添加到我的bootstrap文件中,我发现它非常整洁。

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

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

有关mb_internal_string结帐的更多信息:http://php.net/manual/en/function.mb-internal-encoding.php