Доброго времени! Помогите разобраться с кодировками и сделать по-человечески Итак, ДАНО: Есть корректно раборающий сайт с костылями по кодировке. 1. Сайт лежит на хостинге с кодировкой для БД utf8 2. В .htaccess указано Код (PHP): AddDefaultCharset utf-8 3. В meta указано Код (PHP): <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 4. При подключении к БД Код (PHP): $query = mysqli_query($db, "SET NAMES 'utf8'") 5. Все скрипты сайта лежат в кодировке utf8 6. Некоторые поля в таблицах имеют кодировку cp1251, некоторые utf8_bin ЗАДАЧА: Перенести сайт на локалхост, все выпрямить и вернуть на хостинг. 1. При простом дампе БД и файлов, русский текст отображается как 2. Если при подключении к БД закомментировать строку Код (PHP): $query = mysqli_query($db, "SET NAMES 'utf8'") то текст превращается в ?????????? 3. Если при подключении к БД изменить эту строку на Код (PHP): $query = mysqli_query($db, "SET NAMES 'cp1251'") то текст отображается корректно. 4. Текст из скриптов отображается корректно, если изменить кодировку файла на ANSI. 5. На локале в my.ini указано Код (PHP): default-character-set=utf8 ВОПРОС: как привести все к единому виду и на локале, и на хостинге и избавиться от этой каши? Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
достать, переконвертировать и положить. У тебя таблица utf, но данные в неё были записаны как 1251, поэтому они и достаются корректно в 1251, не зависимо от кодировки соединения с бд.
попробовал сделать еще один дамп... перекодировал в utf8 с помощют notepad++ - то же самое. еще пара вводных: на локале в phpMyAdmin видны такие штуки: На хостинге такого нет. Но при этом, если подключаться к БД в кодировке cp1251, то текст отрисовывает нормально. Также, при редактировании этих записей в phpMyAdmin тоже все пучком. Т.е. они видны только при просмотре таблиц так, как на скрине. И еще, в дампе есть записи вида Код (PHP): CREATE TABLE `catalog` ( ... `title` varchar(250) CHARACTER SET cp1251 NOT NULL, п.с. научным тыком варианты с импортом в cp1251 тоже попробовал Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
дамп сделал. в нем все нормально читается и из него заливается. в phpMyAdmin все выглядит нормально (если не считать знаки вопроса в ромбиках). на сайте проблема осталась. Пробовал создать новую БД на локалке и вручную пересоздать одну из таблиц. Результат тот же: корректно отображается только при подключении SET NAMES 'cp1251'. Может не в базе проблема?... (ну помимо того, что в кривых рученках)
это ты называешь "нормально"? ))) я предлагал тебе между дампом и заливкой выправить кодировку. Добавлено спустя 48 минут 54 секунды: Развивающая задачка: Код (PHP): DROP TABLE IF EXISTS `table_utf8`; CREATE TABLE `table_utf8`(`caption` VARCHAR(100) NOT NULL PRIMARY KEY) CHARSET 'UTF8'; INSERT INTO `table_utf8` VALUES ('Собачка'), ('Кошечка'); DROP TABLE IF EXISTS `table_cp1251`; CREATE TABLE `table_cp1251`(`caption` VARCHAR(100) NOT NULL PRIMARY KEY) CHARSET 'CP1251'; INSERT INTO `table_cp1251` VALUES ('Собачка'), ('Кошечка'); Это всё в ОДНОМ файле, я его выполнил, допустим, в phpmyadmin за один приём. Как ты думаешь, как будет выглядеть текст в этих таблицах в phpmyadmin? Как будет выглядеть текст в результате такого запроса: Код (PHP): SELECT * FROM `table_utf8`, `table_cp1251`; в phpmyadmin? А в твоём скрипте если он в 1251 и ты сделаешь header() и set names соответствующие? А в твоём скрипте если он в utf8 и ты сделаешь header() и set names соответствующие? Ответ
Уважаемый, вы меня не поняли... Я не пытаюсь спорить. Я же за помощью пришел ) Перед заливкой я перекодировал базу notepad++. Я так понимаю, что этого не достаточно? Нужен именно iconv? И второй вопрос (риторический): помему же тогда из созданной вручную базы тоже не вытягивает? База: Код (PHP): CREATE TABLE IF NOT EXISTS `headers` ( `id` int(5) NOT NULL AUTO_INCREMENT, `title` varchar(250) COLLATE utf8_bin NOT NULL, `keywords` varchar(250) COLLATE utf8_bin NOT NULL, `keywords2` varchar(250) COLLATE utf8_bin NOT NULL, `description` varchar(250) COLLATE utf8_bin NOT NULL, `Page` varchar(250) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ; INSERT INTO `headers` (`id`, `title`, `keywords`, `keywords2`, `description`, `Page`) VALUES (1, 'мазафака тест', '', '', '', ''); Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
А я с тобой и не спорю. Я подсказываю путь. Если что-то непонятно, могу уточнить. Пространства для разных мнений тут нет, тема на 140% проверенная. Раз результата нет, прошу уточнить: что ты называешь "перекодировал notepad++"? Когда ты открываешь файл с дампом в редакторе, русский текст отображается без ошибок? Какую при этом кодировку показывает редактор?
В файле дампа все отображается корректно. Кодировку показывает utf8 без BOM Заливаю в utf8. Пробовал сливать дамп в cp1251, в notepad++ использовал Кодировки -> Преобразовать в utf8 без BOM и потом заливать. Пробовал сливать дамп сразу в utf8...
Исполняешь где свой файл дампа? При этом какая кодировка соединения выбрана? Добавлено спустя 2 минуты 42 секунды: [offtopic] Незачем указывать коллейшн у каждого поля, когда он один и тот же. Достаточно один раз написать для всей таблицы. Почему выбран utf8_bin? (небольшое пояснение) [/offtopic]
дамп делаю средствами phpmyadmin хостинга upload так же через phpmyadmin на локалке Почему выбран utf8_bin - на этот вопрос у меня нет ответа, по скольку нет столь глубоких познаний. готов прислушаться к совету )
Я про раздел импорта. (На главной страничке PMA я бы тоже рекомендовал "Сопоставление кодировки соединения с MySQL" выбирать из UTF8MB4 или UTF8, но речь об импорте). Где-то ты ошибаешся. Либо твой файл некорректно отображается в UTF-8, либо ты заливаешь его, указав иную кодировку. Иначе результат уже должен быть нормальный, без "ромбиков". Добавлено спустя 1 минуту 39 секунд: Сам PMA у тебя с русским интерфейсом, русские слова в интерфейсе в порядке?
Pma с русским интерфейсом. На главной страничке сопоставление не указано. При указании оно не сохраняется. Ромбики видны только в предпросмотре. При редактировании в пма, текс отображается корректно
Ну ок тогда, видимо база в порядке, просто PMA в чём-то кривой. Осталось убедиться, что твои скрипты могут выводить корректные данные, что при выполнении этих условий твой скрипт выведет русский текст нормально. Сделай простой тест: хидер, коннект, сет неймс, квери, фетч, эхо. Без лишних зависимостей. Всё должно быть хорошо.
Код (PHP): $db=mysqli_connect ($dblocation,$dbuser,$dbpassword); if (!$db) // Если соединение не установлено {echo "<p>В данный момент соединиться с базой данных не возможно. Напишите об этом администратору.</p>"; exit(); } $query = mysqli_query($db, "SET NAMES 'utf8'"); mysqli_select_db ($db,"kodi"); $q=mysqli_query($db,"SELECT * From headers"); $arr=mysqli_fetch_array($q); echo $arr['title']; вывело кракозяблы. с cp1251 выводит правильно. Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
здесь нет header(…charset…). видимо кодировка страницы в браузере в обоих случаях остается одна и та же. Надо сообщить кодировку страницы и браузеру, и серверу БД! Обоим. Добавлено спустя 1 минуту 35 секунд: p.s. dJam, тебя не смущает, что denis01 всякий раз улучшает твои сообщения с кодом? ты мог бы это делать сам.
Код (PHP): <?php $dblocation = "localhost"; $dbuser = "localhost"; $dbpassword = "123"; $db=mysqli_connect ($dblocation,$dbuser,$dbpassword); if (!$db) {echo "<p>cannot connect</p>"; exit(); } $query = mysqli_query($db, "SET NAMES 'utf8'"); mysqli_select_db ($db,"kodi"); $q=mysqli_query($db,"SELECT * From headers"); $arr=mysqli_fetch_array($q); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="ru"> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <body> <?php echo $arr['title']; ?> </body> </html> ничего не изменилось п.с. сорри, я не обратил внимание на =php
вижу. а ты добавь header, тогда изменится. у тебя два параметра, т.е. четыре варианта сочетаний. поиграй с ними, убедись, что они действуют. я, если честно, уже устал капитанить.
переделал в Код (PHP): <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>11</title> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> </head> <body> <?php echo $arr['title']; ?> </body> </html> два параметра это xml:lang="en" lang="en"? перепробовал комбинации - без изменений. я, на самом деле, очень признателен за помощь. хз куда копать самому
трындец... открыл блокнотом файл соединения с БД и в Сохранить как... указал сохранение в utf8, хотя и так было... и заработало! Как, Кайл?! 25 раз я пересохранял этот файл в utf8 в различных вариантах исполнения...