За последние 24 часа нас посетили 16125 программистов и 1547 роботов. Сейчас ищут 866 программистов ...

Каша с кодировкой хостинг+локалхост

Тема в разделе "PHP и базы данных", создана пользователем dJam, 22 фев 2016.

  1. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    Доброго времени!
    Помогите разобраться с кодировками и сделать по-человечески

    Итак, ДАНО:
    Есть корректно раборающий сайт с костылями по кодировке.
    1. Сайт лежит на хостинге с кодировкой для БД utf8
    2. В .htaccess указано
    Код (PHP):
    1. AddDefaultCharset utf-8
    3. В meta указано
    Код (PHP):
    1. <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
    4. При подключении к БД
    Код (PHP):
    1. $query = mysqli_query($db, "SET NAMES 'utf8'") 
    5. Все скрипты сайта лежат в кодировке utf8
    6. Некоторые поля в таблицах имеют кодировку cp1251, некоторые utf8_bin
    ЗАДАЧА:
    Перенести сайт на локалхост, все выпрямить и вернуть на хостинг.
    1. При простом дампе БД и файлов, русский текст отображается как
    2. Если при подключении к БД закомментировать строку
    Код (PHP):
    1. $query = mysqli_query($db, "SET NAMES 'utf8'") 
    то текст превращается в ??????????
    3. Если при подключении к БД изменить эту строку на
    Код (PHP):
    1. $query = mysqli_query($db, "SET NAMES 'cp1251'") 
    то текст отображается корректно.
    4. Текст из скриптов отображается корректно, если изменить кодировку файла на ANSI.
    5. На локале в my.ini указано
    Код (PHP):
    1. default-character-set=utf8
    ВОПРОС:
    как привести все к единому виду и на локале, и на хостинге и избавиться от этой каши?

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    достать, переконвертировать и положить. У тебя таблица utf, но данные в неё были записаны как 1251, поэтому они и достаются корректно в 1251, не зависимо от кодировки соединения с бд.
     
  3. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    вроде уже пробовал, но на всякий случай повторю.
    доставать в какой кодировке?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    mysqldump сделай, а там увидишь что получилось. Если понадобится, сконвертишь iconv.
     
  5. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    попробовал сделать еще один дамп...
    перекодировал в utf8 с помощют notepad++ - то же самое.
    еще пара вводных:
    на локале в phpMyAdmin видны такие штуки:
    [​IMG][​IMG]
    На хостинге такого нет. Но при этом, если подключаться к БД в кодировке cp1251, то текст отрисовывает нормально. Также, при редактировании этих записей в phpMyAdmin тоже все пучком. Т.е. они видны только при просмотре таблиц так, как на скрине.
    И еще, в дампе есть записи вида
    Код (PHP):
    1. CREATE TABLE `catalog` (
    2.   ...
    3.   `title` varchar(250) CHARACTER SET cp1251 NOT NULL, 
    п.с. научным тыком варианты с импортом в cp1251 тоже попробовал

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  6. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    дамп сделал. в нем все нормально читается и из него заливается. в phpMyAdmin все выглядит нормально (если не считать знаки вопроса в ромбиках). на сайте проблема осталась.
    Пробовал создать новую БД на локалке и вручную пересоздать одну из таблиц. Результат тот же: корректно отображается только при подключении SET NAMES 'cp1251'.
    Может не в базе проблема?... (ну помимо того, что в кривых рученках)
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    это ты называешь "нормально"? ))) я предлагал тебе между дампом и заливкой выправить кодировку.

    Добавлено спустя 48 минут 54 секунды:
    Развивающая задачка:
    Код (PHP):
    1. DROP TABLE IF EXISTS `table_utf8`;
    2. CREATE TABLE `table_utf8`(`caption` VARCHAR(100) NOT NULL PRIMARY KEY) CHARSET 'UTF8';
    3. INSERT INTO `table_utf8` VALUES ('Собачка'), ('Кошечка');
    4.  
    5. DROP TABLE IF EXISTS `table_cp1251`;
    6. CREATE TABLE `table_cp1251`(`caption` VARCHAR(100) NOT NULL PRIMARY KEY) CHARSET 'CP1251';
    7. INSERT INTO `table_cp1251` VALUES ('Собачка'), ('Кошечка');
    8.  
    Это всё в ОДНОМ файле, я его выполнил, допустим, в phpmyadmin за один приём.
    Как ты думаешь, как будет выглядеть текст в этих таблицах в phpmyadmin?
    Как будет выглядеть текст в результате такого запроса:
    Код (PHP):
    1. SELECT * FROM `table_utf8`, `table_cp1251`; 
    в phpmyadmin?
    А в твоём скрипте если он в 1251 и ты сделаешь header() и set names соответствующие?
    А в твоём скрипте если он в utf8 и ты сделаешь header() и set names соответствующие?

    Ответ
     
  8. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    Уважаемый, вы меня не поняли...
    Я не пытаюсь спорить. Я же за помощью пришел )

    Перед заливкой я перекодировал базу notepad++. Я так понимаю, что этого не достаточно? Нужен именно iconv?
    И второй вопрос (риторический): помему же тогда из созданной вручную базы тоже не вытягивает? База:
    Код (PHP):
    1. CREATE TABLE IF NOT EXISTS `headers` (
    2.   `id` int(5) NOT NULL AUTO_INCREMENT,
    3.   `title` varchar(250) COLLATE utf8_bin NOT NULL,
    4.   `keywords` varchar(250) COLLATE utf8_bin NOT NULL,
    5.   `keywords2` varchar(250) COLLATE utf8_bin NOT NULL,
    6.   `description` varchar(250) COLLATE utf8_bin NOT NULL,
    7.   `Page` varchar(250) COLLATE utf8_bin NOT NULL,
    8.   PRIMARY KEY (`id`)
    9. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ;
    10.  
    11. INSERT INTO `headers` (`id`, `title`, `keywords`, `keywords2`, `description`, `Page`) VALUES
    12. (1, 'мазафака тест', '', '', '', ''); 
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    А я с тобой и не спорю. Я подсказываю путь. Если что-то непонятно, могу уточнить. Пространства для разных мнений тут нет, тема на 140% проверенная.

    Раз результата нет, прошу уточнить: что ты называешь "перекодировал notepad++"? Когда ты открываешь файл с дампом в редакторе, русский текст отображается без ошибок? Какую при этом кодировку показывает редактор?
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Если перекодировал в windows-1251, то utf8 в SQL запросе на создание базы не смущает?
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Денис, такое возможно. Я выше привел рабочий пример.
     
  12. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    В файле дампа все отображается корректно.
    Кодировку показывает utf8 без BOM
    Заливаю в utf8.
    Пробовал сливать дамп в cp1251, в notepad++ использовал Кодировки -> Преобразовать в utf8 без BOM и потом заливать. Пробовал сливать дамп сразу в utf8...
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Исполняешь где свой файл дампа? При этом какая кодировка соединения выбрана?

    Добавлено спустя 2 минуты 42 секунды:
    [offtopic]
    Незачем указывать коллейшн у каждого поля, когда он один и тот же. Достаточно один раз написать для всей таблицы.
    Почему выбран utf8_bin? (небольшое пояснение)
    [/offtopic]
     
  14. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    дамп делаю средствами phpmyadmin хостинга
    upload так же через phpmyadmin на локалке
    Почему выбран utf8_bin - на этот вопрос у меня нет ответа, по скольку нет столь глубоких познаний. готов прислушаться к совету )
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
     
  16. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    если вы про раздел импорта файлов, то utf8.
    если о чем-то другом - тогда подсказывайте, где смотреть
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Я про раздел импорта. (На главной страничке PMA я бы тоже рекомендовал "Сопоставление кодировки соединения с MySQL" выбирать из UTF8MB4 или UTF8, но речь об импорте).

    Где-то ты ошибаешся. Либо твой файл некорректно отображается в UTF-8, либо ты заливаешь его, указав иную кодировку. Иначе результат уже должен быть нормальный, без "ромбиков".

    Добавлено спустя 1 минуту 39 секунд:
    Сам PMA у тебя с русским интерфейсом, русские слова в интерфейсе в порядке?
     
  18. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    Pma с русским интерфейсом. На главной страничке сопоставление не указано. При указании оно не сохраняется.
    Ромбики видны только в предпросмотре. При редактировании в пма, текс отображается корректно
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Ну ок тогда, видимо база в порядке, просто PMA в чём-то кривой. Осталось убедиться, что твои скрипты могут выводить корректные данные, что при выполнении этих условий
    твой скрипт выведет русский текст нормально. Сделай простой тест: хидер, коннект, сет неймс, квери, фетч, эхо. Без лишних зависимостей. Всё должно быть хорошо.
     
  20. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    Код (PHP):
    1. $db=mysqli_connect ($dblocation,$dbuser,$dbpassword);
    2. if (!$db) // Если соединение не установлено
    3. {echo "<p>В данный момент соединиться с базой данных не возможно. Напишите об этом администратору.</p>";
    4. exit();
    5. }
    6. $query = mysqli_query($db, "SET NAMES 'utf8'");
    7. mysqli_select_db ($db,"kodi");
    8.  
    9. $q=mysqli_query($db,"SELECT * From headers");
    10. echo $arr['title']; 
    вывело кракозяблы. с cp1251 выводит правильно.

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    здесь нет header(…charset…). видимо кодировка страницы в браузере в обоих случаях остается одна и та же.
    Надо сообщить кодировку страницы и браузеру, и серверу БД! Обоим.

    Добавлено спустя 1 минуту 35 секунд:
    p.s. dJam, тебя не смущает, что denis01 всякий раз улучшает твои сообщения с кодом? ты мог бы это делать сам.
     
  22. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    Код (PHP):
    1. <?php
    2. $dblocation = "localhost";
    3. $dbuser = "localhost";
    4. $dbpassword = "123";
    5.  
    6. $db=mysqli_connect ($dblocation,$dbuser,$dbpassword);
    7. if (!$db) 
    8. {echo "<p>cannot connect</p>";
    9. exit();
    10. }
    11. $query = mysqli_query($db, "SET NAMES 'utf8'"); 
    12. mysqli_select_db ($db,"kodi");
    13.  
    14. $q=mysqli_query($db,"SELECT * From headers");
    15. ?>
    16. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    17. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="ru">
    18. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    19. <body>
    20. <?php echo $arr['title']; ?>
    21. </body>
    22. </html>
    ничего не изменилось
    п.с. сорри, я не обратил внимание на =php
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    вижу. а ты добавь header, тогда изменится. у тебя два параметра, т.е. четыре варианта сочетаний. поиграй с ними, убедись, что они действуют.

    я, если честно, уже устал капитанить.
     
  24. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    переделал в
    Код (PHP):
    1. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    2. <head>
    3. <title>11</title>
    4. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    5. </head>
    6. <body>
    7. <?php echo $arr['title']; ?>
    8. </body>
    9. </html>
    два параметра это xml:lang="en" lang="en"? перепробовал комбинации - без изменений.
    я, на самом деле, очень признателен за помощь. хз куда копать самому
     
  25. dJam

    dJam Новичок

    С нами с:
    22 фев 2016
    Сообщения:
    14
    Симпатии:
    0
    трындец...
    открыл блокнотом файл соединения с БД и в Сохранить как... указал сохранение в utf8, хотя и так было... и заработало!
    Как, Кайл?! 25 раз я пересохранял этот файл в utf8 в различных вариантах исполнения...