Как установить кодировку UTF-8 в приложении Zend? - PullRequest
6 голосов
/ 08 июня 2011

Я разрабатываю приложение 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 ]

16 голосов
/ 08 июня 2011

Вы установили следующее, чтобы получать данные из MySQL как utf8?

resources.db.params.charset = "utf8"

Для правильного отображения правильных символов необходимо сделать три вещи:

  1. СохранитьФайлы PHP / HTML в кодировке utf8
  2. Извлечение данных из MySQL как utf8
  3. Отправьте правильный заголовок типа контента / charset или используйте метатег

Дополнительная информацияв статья Роба Аллена .

7 голосов
/ 28 марта 2013

У меня была такая же проблема при использовании модуля Doctrine2 в моем приложении Zend Framework 2. Явная установка набора символов для моего модуля 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\''
    )
),
3 голосов
/ 08 июня 2011

Вы пробовали также установить заголовки в utf8? Обычно в php я делаю это так

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

в вашем случае я думаю, что вы должны использовать что-то другое. я взял этот пример из документации Zend Framework возможно, вам следует использовать что-то другое, я не эксперт Zend_Framework

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

Если вы устанавливаете заголовки, мета и кодирование должно работать (из вашего кода мне кажется, что вы устанавливаете только мета и кодировку)

(посмотрите на этот вопрос, чтобы понять, что я имею в виду, ответ Берри Лангерака: Специальные символы отображения PHP )

РЕДАКТИРОВАТЬ - я также нашел другой пример в этой статье, где он устанавливает заголовок для контроллера, взгляните на него, возможно, это то, что вы ищете: 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;

}
1 голос
/ 07 июня 2019

, как говорили другие, мы должны установить кодировку, в моем Zend Framework я должен был сделать это немного по-другому:

  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
Вы должны установить базу данных и таблицу на 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;
1 голос
/ 09 июня 2011

Возможно, вам следует попробовать отредактировать ваши исходные файлы, сохранив UTF-8 в качестве кодировки вашего редактора. Иногда, даже если вы используете UTF-8 в заголовках HTML, кодировке базы данных и т. Д., Если ваши исходные файлы находятся в другой кодировке, это может привести к такого рода ошибкам.

0 голосов
/ 19 января 2018

У меня была такая же проблема, я исправил ее в config / autoload / global.php, установив значение charset:

'db' => [
    'adapters' => [
        'dummy' => [],
        'myadapter' => ['charset'  => 'utf-8',],
    ],
0 голосов
/ 02 января 2013

Если вы поместите всю кодификацию и сопоставление, такие как 'utf8_general_ci', в BD, а затем в application.ini сразу после параметров подключения mysql, resources.db.params.charset = "utf8" должно сработать.

0 голосов
/ 08 июня 2011

Если вам нужно использовать utf8_encode (), это означает, что данные в вашей базе данных не закодированы в UTF8.Когда вы говорите, что ваша база данных закодирована в "utf8_unicode_ci", это на самом деле не означает, что ваши данные закодированы в UTF8.

Чтобы убедиться, что кодировка набора работает с Zend Framework, используя любой код, который вы показываетеэто довольно легко.С Firefox просто щелкните правой кнопкой мыши на странице и нажмите «Просмотр информации о странице», если он говорит «Кодировка: UTF8», это означает, что ваша страница правильно закодирована, но ваши данные не.

Если вы использовали utf8_decode(), тогда это будет означать, что Zend не может установить кодировку.

0 голосов
/ 08 июня 2011

Я использовал для разработки приложений ZF на многих языках, включая RTL.и я обычно добавлял это в свой файл начальной загрузки, и я нашел его довольно аккуратным.

возможно, это не ответ, но я думаю, что это хорошее предложение :

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

для получения дополнительной информации о mb_internal_string проверить: http://php.net/manual/en/function.mb-internal-encoding.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...