Проблема с кодировкой UTF-8, CodeIgniter 1.5.*
- Автор mityok on февраля 7th, 2008
Возможно, у вас возникала ситуация, когда при попытке использовать кодировку UTF-8 для хранения данных в БД MySQL вместо сохраненных данных, например строки "Мой сайт будет лучше, чем Google!", после чтения из базы данных на экран выводятся банальные знаки вопроса, и строка превращается в "??? ???? ????? ?????, ??? Google!", либо вместо сохраненных на русском языке данных на странице выводяться кракозяблы.
В свое время я столкнулся с такой проблемой, и нашел возможные ее причины и способы решения.
Проверяем базу данных MySQL
Для начала убедимся, что данные храняться в таблицах именно в нужной нам кодировке UTF-8. Для этого убедитесь, что кодировка для вашей базы данных а также таблиц в ней установлена правильно. Это можно сделать при помощи утилиты phpMyAdmin или при помощи консольной утилиты для доступа к MySQL.
Проверить кодировку, установленную для базы данных можно при помощи команды
SHOW CREATE DATABASE `test_db`;
При этом вывод команды будет примерно таким:
CREATE DATABASE `test_db` /*!40100 DEFAULT CHARACTER SET utf8 */
Для того, чтобы проверить кодировку, установленную для ваших таблиц в базе данных можно воспользоваться командой
SHOW CREATE TABLE `test_table`;
Результат работы этой команды будет примерно таким:
CREATE TABLE `test_table` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(20) NOT NULL, ) ENGINE=MyISAM DEFAULT CHARSET=utf8
При этом стоит обратить внимание на то, что MySQL позволяет использовать различные кодировки для разных полей в рамках одной таблицы.
Примечание: если вы используете phpMyAdmin для проверки правильности данных , то убедитесь что параметр "MySQL connection collation" установлен в значение, соответствующее UTF-кодировке, например "utf8_unicode_ci". Если для базы данных, таблицы, и SQL-клиента выставлена кодировка UTF-8, а при выводе данных (еще не используя CodeIgniter) у вас вместо русских символов наблюдается недоразумение, то возможно что вы вносили данные в базу используя некорректные настройки кодировки. Скорее всего, прийдется осуществить импорт этих данных повторно или писать скрипт для перекодировки данных.
Кодировка вывода данных
Убедитесь, что текстовый вывод вашего приложения распознается браузером в правильной кодировке. Для того, чтобы задать кодировку текста, которую должен использовать браузер нужно установить значение кодировки в мета-теге "content-type" :
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
Знаки вопроса вместо русских символов
Эта проблема возникает в основном из-за того, что MySQL использует одну кодировку для хранения данных (UTF-8) и другую кодировку для обмена между клиентом и сервером (как правило администраторы оставляют latin-1 чтобы пользователи могли сами установить в своем приложении нужную им кодировку).
Для решения этой проблемы нужно перед любым запросом или командой SQL выполнить следующую команду:
SET NAMES UTF8
В результате ее выполнения MySQL настроит в рамках текущего соединения клиент и сервер на работу в кодировке UTF-8.
В CodeIgniter версии 1.5 не было встроенного средства для установки кодировки соедниения с БД, поэтому нужно было вручную выполнить эту команду перед первым запросом к БД, а также для каждого нового подключения к БД.
Для того, чтобы данная команда вызывалась каждый раз при вызове приложения, воспользуемся такими средствами CodeIgniter как хуки (системные вызовы).
1. Создадим класс хелпера следующего содержания:
<?php class MyHooks { function MyDatabaseFixup() { $CI =& get_instance(); $CI->db->simple_query('SET NAMES UTF8'); } } ?>
и сохраним его в каталоге applicatin/hooks/MyHooks.php.
Примечание: я подразумаю, что соедиение с базой данных уже установлено за счет авто-загрузки библиотеки доступа к БД в файле application/config/autoload.php
2. Пропишем вызов нашего хука в файле application/config/hooks.php. Для этого внесем в него следующий код:
'class' => 'MyHooks', 'function' => 'MyDatabaseFixup', 'filename' => 'MyHooks.php', 'filepath' => 'hooks', );
Идентификатор хука "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
Отправить комментарий