Помогите разобраться с кодировками

Obormot

Постоялец
Регистрация
10 Янв 2012
Сообщения
88
Реакции
2
Уже 3тий день воюю с кодировками в базе, замучался окончательно. :(
Сначала был проблема только с выводом букв ш и и теперь выявились еще косяки.

Теперь по порядку:
Сам скрипт осуществляет вывод страниц в кодировке UTF-8:
Код:
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
При инсталяции скрипт загружает дамп БД с такими параметрами:
Код:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";;
ALTER DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;;
под каждой таблицей в дампе:
Код:
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=%%__CONTESTS_INC__%% ;;
Все, отлично скрипт установили, теперь направляемся в БД через phpmyadmin, там спрашиваем:
Код:
SHOW VARIABLES LIKE 'character_set%';
Получаем ответ:
Код:
character_set_client    utf8
character_set_connection    utf8
character_set_database    utf8
character_set_filesystem    binary
character_set_results    utf8
character_set_server    cp1251
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/
В переводе я понимаю так:
  • character_set_client — указывает, в какой кодировке будут поступать данные от клиента;
  • character_set_connection — указывает, в какую кодировку следует преобразовать данные полученые от клиента перед выполнением запроса;
  • collation_connection — указывает, каким образом сравнивать между собой строки в запросах;
  • character_set_results — указывает серверу не необходимость перекодировать результаты запроса в определенную кодировку перед выдачей их клиенту.
Пока вроде все замечательно - скрипт должен записывать данные в БД в UTF-8, забирать данные так же в UTF-8, и выводить на свои страницы которые так же в UTF-8 !!
Теперь начинается самое интересное.
Идем в админку скрипта, меняем например заголовок страницы с Main на "Главная", сохраняем, идем в БД , а там:
Код:
Главная
Как так ?? Откуда взялась кодировка cp1251 или что это вообще??
Дальше еще интереснее. Меняем в ручную в базе заголовк на "Главная", сохраняем, теперь в базе все ок! Идем на главную страницу скрипта а там:
Код:
�������
я вообще ничего не понимаю.
Регистрируемся, получаем письмо на почту (смотрим кодировку шаблона письма в скрипте - UTF-8)! В письме есть инклуд меню сайта, соответтвенно при формировании письма скрипт берет данные из базы. Меню скрипта так же содержится в базе и так же изменяется из админки, меняем пунк меню из админки с "Home" на "Главная", в базе получаем все теже Сервис , но в письме этот пункт меню уже выглядит так:​
Код:
Главная
- что за фигня :eek: Откуда взялась еще кодировка какая то.. Что касается по скрипту, то классы подключения к БД не нашел, искал по файлам скрипта по запросам: "SET NAMES", так же искал слова "cp1251" "windows-1251" (думал он где нибуд перегоняте как-то) - ничего не нашел. По запросу
mysql_connect намека на кодировки нет.​
И это все еще дополняет кривые буквы Ш и и. ВОт так.
Прошу помочь дабы не сойти с ума : )
 
Так же любопытно что в скрипте было указано изначально в коде:
Код:
if( $title && $mainframe->cfg->use_multi_lang ) $title = preg_replace('/[^\040-\377]*/uis', '', $title);
С такой настройкой русские заголовки не выводились вообще, в другой теме подсказали что для utf нужно прописать так:
Код:
('/[^\040-\377]*/ui', '', $title);
Так тоже не выводились!
Стали выводиться когда прописал вариант для cp1251:
Код:
preg_replace('/[^\040-\377]*/i', '', $title);
Тоже для меня не понятно ! Откуда и где завуалирована кодировка cp1251.
 
В самой базе посмотри, нормально записывает?

Попробуй так:
mysql_query( "set session character_set_server=cp1251;");
mysql_query( "set session character_set_database=cp1251;");
mysql_query( "set session character_set_connection=cp1251;");
mysql_query( "set session character_set_results=cp1251;");
mysql_query( "set session character_set_client=cp1251;");
 
Что нормально записывает ?
Идем в админку скрипта, меняем например заголовок страницы с Main на "Главная", сохраняем, идем в БД , а там: Код: Главная
Выполнил запрос в БД:
Код:
set session character_set_server=cp1251;
set session character_set_database=cp1251;
set session character_set_connection=cp1251;
set session character_set_results=cp1251;
set session character_set_client=cp1251;
Не помогло. Все также при записи их админки русских сымволов в БД получаем:
Главнаяа
 
Obormot сказал(а:( ↑ Откуда и где завуалирована кодировка cp1251. character_set_server cp1251
Ну это я так понял глобальные настройки сервера. У меня на сервера много скриптов в том числе ВордПрес, ДЛЕ и т.д, у них настройки такие:
Код:
character_set_client    utf8
character_set_connection    utf8
character_set_database    cp1251
character_set_filesystem    binary
character_set_results    utf8
character_set_server    cp1251
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/
Все соотвествено работает нормльно

И как кодировка на самом сервере влияет на запись и выдачу данных из БД, все ведь отдельно четко прописано, или может ? :confused:
 
Я в таких случаях выгружаю базу, дамп через Notepad++ конвертирую в UTF8, затем заливаю обратно. Помогает.
Для записи в базу можно использовать библиотеку php_iconv, геморно, но зато надежно.
 
1. Прорвете сами скрипты в какой кодировке,
2. В коннекте к БД SET NAMES 'utf8'

Если не помогло, тога открываете ваш дамп в любом редакторе с поддержкой кодировок, конвертируете в UTF8, сохраняете загружаете руками через phpmyadmin или сам mysql
 
Вот функция конекта:
Код:
if(!($this->_resource = @mysql_connect ($cfg->dbhost.$port, $cfg->dbuser, $cfg->dbpasswd))){
                echo '<html><body><br><br>
                    <span style="font-family: Arial, Helvetica, sans-serif; font-size: 1.5em">
                    Sorry... Our Site seems to be down temporarily.</span></body></html>';
                exit;
Подскажите как сюда подставить SET NAMES 'utf8' ?
 
Я так понимаю, сразу после exit;}
 
Назад
Сверху