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

Тема в разделе "Базы данных", создана пользователем Obormot, 18 мар 2012.

Модераторы: latteo
  1. Obormot

    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 намека на кодировки нет.​
    И это все еще дополняет кривые буквы Ш и и. ВОт так.
    Прошу помочь дабы не сойти с ума : )
     
  2. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Так же любопытно что в скрипте было указано изначально в коде:
    Код:
    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.
     
  3. bork75

    bork75 The Team

    Регистр.:
    21 июн 2008
    Сообщения:
    1.451
    Симпатии:
    677
    В самой базе посмотри, нормально записывает?

    Попробуй так:
    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;");
     
  4. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    612
    Симпатии:
    386
    character_set_server cp1251
     
  5. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Что нормально записывает ?
    Выполнил запрос в БД:
    Код:
    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;
    Не помогло. Все также при записи их админки русских сымволов в БД получаем:
    Главнаяа
     
  6. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Ну это я так понял глобальные настройки сервера. У меня на сервера много скриптов в том числе ВордПрес, ДЛЕ и т.д, у них настройки такие:
    Код:
    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:
     
  7. andrei_k

    andrei_k

    Регистр.:
    17 янв 2010
    Сообщения:
    253
    Симпатии:
    52
    Я в таких случаях выгружаю базу, дамп через Notepad++ конвертирую в UTF8, затем заливаю обратно. Помогает.
    Для записи в базу можно использовать библиотеку php_iconv, геморно, но зато надежно.
     
  8. shaen

    shaen Постоялец

    Регистр.:
    23 июн 2011
    Сообщения:
    51
    Симпатии:
    9
    1. Прорвете сами скрипты в какой кодировке,
    2. В коннекте к БД SET NAMES 'utf8'

    Если не помогло, тога открываете ваш дамп в любом редакторе с поддержкой кодировок, конвертируете в UTF8, сохраняете загружаете руками через phpmyadmin или сам mysql
     
  9. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Вот функция конекта:
    Код:
    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' ?
     
  10. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Я так понимаю, сразу после exit;}