Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set charset to UTF-8 in a Zend application?

I am developping a Zend application. The data in my database is encoded in "utf8_unicode_ci". I declared in my application.ini :

resources.view.encoding = "UTF-8"

but whenever I try to retrieve a String containing special characters like

{'é', 'à', 'è',...} in the db, the string doesn't display unless I use the function : utf8_decode()

So I tried to set the charset to UTF-8 in :

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;
}

Layout :

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

application.ini :

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

EDIT : Now I can display special chars in a page, but when I retrieve elements from the database, special chars are not displayed.

  • an escaped string returns null ($this->escape($string))
  • echo $string substitutes special chars with ?

so I still have to use utf8_decode() to display them. Any suggestion ?

thanks for your help !!

like image 295
Jerec TheSith Avatar asked Jun 08 '11 08:06

Jerec TheSith


2 Answers

Have you set the following, to fetch data from MySQL as utf8?

resources.db.params.charset = "utf8"

It is necessary to do three things to get correct characters displaying correctly:

  1. Save PHP/HTML files in utf8 encoding
  2. Fetch data from MySQL as utf8
  3. Send the right content-type / charset header or use a meta tag

Further information in Rob Allen's article.

like image 181
David Snabel-Caunt Avatar answered Oct 05 '22 23:10

David Snabel-Caunt


I had the same problem while using the Doctrine2 module in my Zend Framework 2 application. Explicitly setting the character set for my Doctrine2 module solved the issue...

Just add 'charset' => 'utf8' to your doctrine connection parameters:

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

Might also work for your normal database connection. Add 'charset=utf8' to the connection string:

'db' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:host=$localhost;dbname=$yourdatabase;charset=utf8',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    )
),
like image 27
Wilt Avatar answered Oct 06 '22 01:10

Wilt