За последние 24 часа нас посетили 24293 программиста и 1645 роботов. Сейчас ищет 1321 программист ...

Проблема с кодировками

Тема в разделе "PHP для новичков", создана пользователем FalkoN, 9 июн 2013.

  1. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Здравствуйте, господа программисты!

    Помогите решить проблему.
    Хотел перенести сайт с хостинга на свой комп.
    Экспортировал базу, скачал файлы.
    Все работает, только кириллический текст, получаемый из базы, выводится в виде знаков вопроса.
    В PHPMyAdmin текст в базе отображается нормально.
    При добавлении данных в базу с сайта добавленный текст видится в PHPMyAdmin тоже в виде знаков вопроса.

    Кодировка файлов win-1251, сравнение таблиц стоит win-1251.
    В общем, на хостинге было все нормально, а при переносе стало вот так.

    Я работаю под денвером, который установлен на win 8. Мне кажется это именно из-за винды, так как в некоторых других прогах тоже проблемы с кодировкой, которых не было в винде XP.

    Подскажите, где что поправить, как решить проблему?
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Может попробовать установить кодировку соединения с базой?
     
  3. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Кодировка соединения с базой на хостинге стояла utf-8 и все работало нормально.
    У себя тоже пробовал, ставил и utf и win1251, все равно проблема остается.
     
  4. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Что делать-то? Помогите, знающие люди!
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А браузер как определяет кодировку?
     
  6. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    в браузере стоит автоматический выбор. Я пробовал менять, но не помогло.
    Главное, текст, который выводится не из базы, отображается нормально.
    И в обратную сторону так же:
    вводишь в форму страницы текст, который скрипт должен в базу положить. Заходишь в базу в phpmyadmin, а там в этой строке одни вопросики!

    Я уже пробовал экспорт с хостинга делать в другой кодировке и потом импорт себе в базу, но так вообще фигня какая-то отображается.

    Может так влиять то, что под виноуз8 денвер стоит?
    Я уж думаю дополнительно установить на ноут ХР и работать с нее )
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    без вариантов - надо прописать кодировку соединения. представь что "клиент" и "сервер" это два обдолбаных тупых чувака. они общаются посредством телефона. если они говорят на разных языках, то могут этого не понять, увы! поэтому "клиент" должен объявить: я буду разговаривать по английски (или русски - пох). в интернетах проблема гуглится как "set names". по последним данным самым правильным способом является вызов mysqli_set_charset или mysql_set_charset смотря что ты там используешь.

    здесь есть одна засада: после того как ты сделаешь всё правильно, те данные клоторые УЖЕ были записаны в базу, будут выглядеть плохо, т.к. записаны неправильно. это многих подталкивает к неправильным выводам и они продолжают ныть: "ничего не помогает, спасите-помогите". старое уже испорчено, ты работаешь на будущеее!

    Добавлено спустя 2 минуты 29 секунд:
    Код (PHP):
    1. $mysqli = new mysqli("localhost", "my_user", "my_password", "test");
    2. // если ты такой странный, твои файлы имеют кодировку 1251, 
    3. // то и соединение должно быть 1251 !!!
    4. $mysqli->set_charset("cp1251"); 
    важно: даже если база и таблицы имеют настройку CHARACTER SET UTF8, если ты укажешь другую кодировку соединения, всё будет на лету перекодировано правильно! ты должен указывать ту кодировку, в которой твоя страница, а не ту, в которой твоя таблица. с поправкой на написание. для mysql правильно писать cp1251 или utf8 без дефисов. для заголовка http и для тега html пишем как windows-1251 и utf-8

    Добавлено спустя 6 минут 48 секунд:
    что денвер -- да, может. что windows8 -- нет, версия винды влиять не должна.
    в настройках денвер по умолчанию прописано отсылать заголовок "Content-type: text/html; charset=windows-1251", в интернетах проблема гуглится как AddDefaultCharset. поэтому если ты ЯВНО не пропишешь иное, браузер будет считать, что получил страницу в кодировке 1251. и П0X* КАКОЙ У ТЕБЯ НА СТРАНИЦЕ <meta ...>. заголовки http имеют для браузера высший приоритет.
    в то же время на большинстве хостингов никаких умолчаний на этот счет нет!
     
  8. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Скажите, важно ли, какую кодировку файла я указываю при создании дампа на хостинге?
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    главное чтобы совпадало реальное и подразумеваемое. поэтому:
    всегда выбирай utf-8 и не ошибешся.
     
  10. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    прописал в htaccess кодировку 1251.
    прописал в файле скрипта mysql_set_charset ("cp1251")
    Не пашет падла! )
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    твоя цель засветить говноссылку в подписи? помоему я мечу бисер перед свиньями.
     
  12. FalkoN

    FalkoN Активный пользователь

    С нами с:
    1 апр 2011
    Сообщения:
    184
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Ты спешишь с выводами. Просто совмещаю приятное с полезным. Но это отступление...

    По теме:
    Я сделал следующее. Так как кодировка сайта 1251 и таблицы в базе тоже 1251, я сделал дамп базы на хостинге в кодировке 1251.
    Это база хостинга [​IMG]

    Создал на своем компе базу (сравнение 1251), импортировал таблицы, получил следующее (это база на компе):
    [​IMG]

    На страницах сайта аналогично!
    При этом я сделал set_names и adddefultcharset, короче везде прописал 1251.
    Что я сделал не так??

    Добавлено спустя 16 минут 8 секунд:
    Спасибо тебе, хоть ты и злой сегодня! )
    Заработало, зараза!
    Я правда так и не понял, что помогло, но сделал дамп в utf, создал базу в utf, импортировал таблицы, при этом всякие set_names остались 1251!
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    на здоровье. чтобы понять перечитай что я тебе писал. всё прямо по писанному!

    Добавлено спустя 1 минуту 4 секунды:
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    кодировка подключения к бд тоже должна быть соотв.