Database 如何在Zend应用程序中将字符集设置为UTF-8?

Database 如何在Zend应用程序中将字符集设置为UTF-8?,database,zend-framework,utf-8,character-encoding,Database,Zend Framework,Utf 8,Character Encoding,我正在开发Zend应用程序。我的数据库中的数据以“utf8\U unicode\U ci”编码。 我在application.ini中声明: resources.view.encoding = "UTF-8" resources.view.encoding = "UTF-8" resources.db.params.charset = "utf8" 但是每当我试图检索包含特殊字符的字符串时,比如 {'ee','a','è',…}在数据库中,除非我使用函数:utf8_decode() 因此,我

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

resources.view.encoding = "UTF-8"
resources.view.encoding = "UTF-8"
resources.db.params.charset = "utf8"
但是每当我试图检索包含特殊字符的字符串时,比如

{'ee','a','è',…}在数据库中,除非我使用函数:
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();
application.ini:

resources.view.encoding = "UTF-8"
resources.view.encoding = "UTF-8"
resources.db.params.charset = "utf8"
编辑:现在我可以在页面中显示特殊字符,但当我从数据库检索元素时,特殊字符不会显示

  • 转义字符串返回
    null
    $this->escape($string)
  • echo$string
    将特殊字符替换为
所以我仍然需要使用
utf8\u decode()
来显示它们。有什么建议吗


谢谢你的帮助

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

 header ('Content-type: text/html; charset=utf-8');
在你的情况下,我认为你必须使用不同的东西。我举了一个例子,也许你应该使用不同的东西,我不是Zend_框架的专家

// Within an action controller action:
// Set a header
$this->getResponse()
    ->setHeader('Content-Type', 'text/html')
    ->appendBody($content);
如果您设置了头、元和编码,它应该可以工作(从您的代码来看,您似乎只设置了元和编码)

(看看这个问题来理解我的意思,贝瑞·朗格瑞克的回答:)

编辑-我在本文中还发现了另一个例子,其中它为控制器设置了标题,请看一看,也许这就是您要查找的内容:

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

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;

}

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

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

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

有关
mb\u internal\u string
的更多信息,请查看:

是否设置了以下选项,以utf8格式从MySQL获取数据

resources.db.params.charset = "utf8"
要使正确的字符显示,必须做三件事:

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

  • 有关详细信息,请参见。

    如果需要使用utf8\u encode(),这意味着数据库中的数据不是用utf8编码的。 当你说你的数据库是用“utf8\uUnicode\uCI”编码的时候,实际上并不意味着你的数据是用utf8编码的

    要通过使用您显示的任何代码来验证set编码是否与Zend Framework一起工作,非常简单。使用firefox时,只需右键单击页面并单击“查看页面信息”,如果页面上显示“Encoding:UTF8”,则表示您的页面编码正确,但您的数据没有正确编码


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

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

    如果将所有编码和排序规则(如“utf8\u general\u ci”)放在BD中,然后放在application.ini中mysql连接参数的旁边,
    resources.db.params.charset=“utf8”
    应该可以做到这一点

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

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

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

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

  • 在db.ini文件中:
  • 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
    
  • 您必须将数据库和表设置为UTF-8,我是这样做的:
    ALTER DATABASE skydevel\u skydevfinal字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci;
    ALTER TABLE CHU news_注释转换为字符集utf8mb4 COLLATE utf8mb4_unicode_ci

  • 顺便说一下,我的源文件编码设置为utf-8I已经使用布局文件中的这一行将标题设置为utf8:this->headMeta()->appendHttpEquiv('Content-Type','text/html;charset=utf8');但是我也尝试了你的函数头,返回“header()期望参数3很长,字符串在……中给出……谢谢你的链接(chris.lu),但是我尝试将这个函数放在我的引导程序中,它没有改变任何东西不,我认为这一行只设置了“meta”“:这表示html中的
    。如果你看到我链接的另一个问题,他们设置了meta和header,但是我不知道如何在Zendt中设置header这个答案很好,但是这样设置响应会破坏phpunit中的单元测试谢谢,我添加了这个函数,但它似乎不起作用。事实上,我没有在配置文件中添加这个资源。现在,我的整个应用程序都设置为UTF-8,但尽管我添加了一个
    code
    标题(“内容类型:text/html;charset=UTF-8”)<代码>代码
    当我显示pageheader和meta时,源代码中没有显示。要在html中获取元数据,需要添加echo$this->headMeta();在布局脚本中。您可以设置标头(或让Apache为您设置),也可以按照Maxence所述添加meta标记。你不需要标题和meta标记,但这不会造成伤害,meta标记将用作备份。我所有的源文件都是enc