Проблема с кодировкой UTF-8, CodeIgniter 1.5.*

 

Возможно, у вас возникала ситуация, когда при попытке использовать кодировку UTF-8 для хранения данных в БД MySQL вместо сохраненных данных, например строки "Мой сайт будет лучше, чем Google!", после чтения из базы данных на экран выводятся банальные знаки вопроса, и строка превращается в "??? ???? ????? ?????, ??? Google!", либо вместо сохраненных на русском языке данных на странице выводяться кракозяблы.

В свое время я столкнулся с такой проблемой, и нашел возможные ее причины и способы решения.

Проверяем базу данных MySQL

Для начала убедимся, что данные храняться в таблицах именно в нужной нам кодировке UTF-8. Для этого убедитесь, что кодировка для вашей базы данных а также таблиц в ней установлена правильно. Это можно сделать при помощи утилиты phpMyAdmin или при помощи консольной утилиты для доступа к MySQL.
Проверить кодировку, установленную для базы данных можно при помощи команды

  1. SHOW CREATE DATABASE `test_db`;

При этом вывод команды будет примерно таким:
  1. CREATE DATABASE `test_db` /*!40100 DEFAULT CHARACTER SET utf8 */

Для того, чтобы проверить кодировку, установленную для ваших таблиц в базе данных можно воспользоваться командой
  1. SHOW CREATE TABLE `test_table`;

Результат работы этой команды будет примерно таким:
  1. CREATE TABLE `test_table` (
  2. `id` int(10) unsigned NOT NULL auto_increment,
  3. `name` varchar(20) NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8

При этом стоит обратить внимание на то, что MySQL позволяет использовать различные кодировки для разных полей в рамках одной таблицы.

Примечание: если вы используете phpMyAdmin для проверки правильности данных , то убедитесь что параметр "MySQL connection collation" установлен в значение, соответствующее UTF-кодировке, например "utf8_unicode_ci". Если для базы данных, таблицы, и SQL-клиента выставлена кодировка UTF-8, а при выводе данных (еще не используя CodeIgniter) у вас вместо русских символов наблюдается недоразумение, то возможно что вы вносили данные в базу используя некорректные настройки кодировки. Скорее всего, прийдется осуществить импорт этих данных повторно или писать скрипт для перекодировки данных.

Кодировка вывода данных

Убедитесь, что текстовый вывод вашего приложения распознается браузером в правильной кодировке. Для того, чтобы задать кодировку текста, которую должен использовать браузер нужно установить значение кодировки в мета-теге "content-type" :

  1. <meta http-equiv="content-type" content="text/html; charset=UTF-8">

Знаки вопроса вместо русских символов

Эта проблема возникает в основном из-за того, что MySQL использует одну кодировку для хранения данных (UTF-8) и другую кодировку для обмена между клиентом и сервером (как правило администраторы оставляют latin-1 чтобы пользователи могли сами установить в своем приложении нужную им кодировку).
Для решения этой проблемы нужно перед любым запросом или командой SQL выполнить следующую команду:

  1. SET NAMES UTF8

В результате ее выполнения MySQL настроит в рамках текущего соединения клиент и сервер на работу в кодировке UTF-8.
В CodeIgniter версии 1.5 не было встроенного средства для установки кодировки соедниения с БД, поэтому нужно было вручную выполнить эту команду перед первым запросом к БД, а также для каждого нового подключения к БД.
Для того, чтобы данная команда вызывалась каждый раз при вызове приложения, воспользуемся такими средствами CodeIgniter как хуки (системные вызовы).

1. Создадим класс хелпера следующего содержания:

  1. <?php
  2. class MyHooks {
  3. function MyDatabaseFixup() {
  4. $CI =& get_instance();
  5. $CI->db->simple_query('SET NAMES UTF8');
  6. }
  7. }
  8. ?>

и сохраним его в каталоге applicatin/hooks/MyHooks.php.

Примечание: я подразумаю, что соедиение с базой данных уже установлено за счет авто-загрузки библиотеки доступа к БД в файле application/config/autoload.php

2. Пропишем вызов нашего хука в файле application/config/hooks.php. Для этого внесем в него следующий код:

  1. $hook['post_controller_constructor'][] = array(
  2. 'class' => 'MyHooks',
  3. 'function' => 'MyDatabaseFixup',
  4. 'filename' => 'MyHooks.php',
  5. 'filepath' => 'hooks',
  6. 'params' => array()
  7. );

Идентификатор хука "post_controller_constructor" указывает на то, что пользовательский код будет вызван непосредственно после того, как будет создан экземпляр класса контроллера.

стоит

стоит авто-определение кодировки

Спасибо! Запрос

Спасибо! Запрос "SET NAMES UTF8" помог!

Если кому-то не

Если кому-то не помогло вышесказанное и знаки вопросов вместо русских букв остались, попробуйте следующее:
Изначально мускул работает с кодировкой Латин, а по суму и базы сравнивает с этой кодировкой.

Значит так:
заходим в PHPMyAdmin,
выбираем нужную базу,
далее проходим в "Операции",
Нас интересует пункт "Сравнение".

Если там установленно что-то типа Latin бла..бла..бла......, а не 1251, или utf8_general_ci то соотвецтвенно их и устанавливаем.

У меня именно эта прблема была, поэтому смена кодировок в ини файлах не помогала.

header("Content-Type:

header("Content-Type: text/html; charset=utf-8");

ставит кодировку по умолчанию в браузере - утф8, надо ставить в хеде!

commss


commss

Добрый день. У

Добрый день. У меня выводились знаки вопроса вместо русских символов. Выполнил инструкции, приведенные в этом посте. Теперь вместо русских букв выводятся иероглифы. Если поменять кодировку вручную в браузере, то все нормально.

В мета-теге charset=UTF-8. В чем может быть проблема?

В настройках

В настройках браузера указано авто-определение кодировки или задано фиксированное значение?
Какую кодировку в браузере вы выбираете вручную?
-----
Посмотрите в файле httpd.conf, какая кодировка установлена по умолчанию для apache (AddDefaultCharset, если я не ошибаюсь)
Кроме того, в php.ini есть директива default_charset, которая задает кодировку по умолчанию для php

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

CAPTCHA
Этот вопрос предназначен для того, чтобы отсеять ботов
6 + 2 =
Решите простой математический пример и введите результат. К примеру, для вопроса 1+3 нужно ввести 4

Вход в систему

Последние комментарии