Проблемы с кодировкой при отправке формы

Тема в разделе "Как сделать...", создана пользователем Sergo_Sev, 15 ноя 2014.

  1. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    При отправке формы во всплывающем окне данные передаются в другой кодировке
    Кодировка страницы и всех файлов cp1251

    Код:
    <?
    
    echo <<<HTML
    <form action="call.php" method="post">
        <div class="Title">Заказать звонок/консультацию</div>
        <div class="Descr successHide">Заполните, пожалуйста, поля ниже, чтобы мы могли связаться с вами</div>
        <div class="oT2 successHide"><table><tbody>
            <tr>
                <td><span>Имя: <font color="red">*</font></span></td>
                <td>
                    <div class="inputText"><i><b><input type="text" name="name" value="{$_POST['name']}" /></b></i></div>
                </td>
            </tr>
            <tr>
                <td><span>Телефон: <font color="red">*</font></span></td>
                <td><div class="inputText"><i><b><input type="text" name="phone" class="phone_number" rel="+7 (999) 999-9999" value="" /></b></i></div>
                </td>
            </tr>
            <tr>
                <td><span>E-mail: </span></td>
                <td><div class="inputText"><i><b><input type="text" name="email" value="" /></b></i></div>
                </td>
            </tr>
            <tr>
                <td><span>Комментарий:</span></td>
                <td>
                    <div class="textarea"><i><b><textarea name="message" cols="30" rows="10" style="height:100px;"></textarea></b></i></div>
                </td>
            </tr>
            <tr>
                <td class="empty">&nbsp;</td>
                <td><div class="Buttons">
                    <div class="button red send">Отправить</div>
                </div></td>
            </tr>
        </tbody></table></div>
    </form>
    HTML;
    
    ?>


    15-11-2014.png

    Если сменить кодировку файла с формой на utf 8 - всё работает правильно, но у меня ведь весь сайт в кодировке cp1251
    Помогите разобраться с проблемой, из-за чего это вообще происходит?
     
    Последнее редактирование: 15 ноя 2014
  2. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    Я задам другой вопрос. Почему вы считаете что у вас кодировка сайта cp1251? И что плохого видите в UTF-8?

    Для справки, иметь в 2014 году сайт в cp1251 - анахронизм и моветон, прямая дорога к таким вот глюкам. Все переползли на UTF-8 лет 5 назад.

    По проблеме: у вас вебсервер, похоже, отдает UTF-8, в заголовках сайта (META) стоит CP1251, что несколько сбивает вас заставляя думать что сайт в CP1251. Этот тег уже определяют браузеры на стороне клиента (и то не все) и показывают страницу в CP (хотя это не нужно), а некоторые при этом фейлят и показывают скорее всего весь сайт кракозябрами.

    Либо перенастраивайте вебсервер (зависит от сервера), либо переводите все в UTF и не мучайтесь больше.
     
    Sergo_Sev нравится это.
  3. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Потому, что в данном случае кодировка исходной страницы в CP1251 и движок DLE, на котором планируется использовать этот модуль, в той же кодировке
    И ещё как ни странно для домена так же прописана кодировка CP1251

    Почему не utf 8 ? Просто потому, что DLE изначально не было в этой кодировке, а после появления версии в utf-8 переводить все сайты в другую кодировку как то бессмысленно если они работают нормально
     
  4. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    если они работают нормально - так ведь не работают, судя по теме

    тогда проверьте в какой кодировке сохранен файл, создающий вывод ( Перейти по ссылке ), вы используете nginx, поэтому убедитесь что в директиве server {} указана корректная кодировка (по дефолту UTF-8) charset windows-1251;

    если это сделано - должно работать. Если не работает - возможно после перенастройки не перезапустили nginx.

    так же можно поставить костыль в сам PHP файл
    PHP:
    header("Content-Type: text/html; charset=windows-1251");
     
  5. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Настройки nginx сейчас посмотрю, но данный скрипт так же работает и на других хостингах
    Строку с отдачей заголовка прописывал - проблема осталась, прикрепляю исходники для примера
    Если отправлять форму обычным способом без скриптов - проблем с кодировкой нет. Может проблема в том, что форма отправляется на сервер скриптом и он отдаёт данные в другой кодировке?

    Если весь сайт останется как есть, а файл который подгружается во всплывающем оrне будет в utf 8, то это не вызовет ещё больше глюков?
     

    Вложения:

    • cart.rar
      Размер файла:
      269,7 КБ
      Просмотров:
      0
  6. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    У вас проблема именно в отдающем скрипте, так как кракозябар на вашем скриншоте - это отображение UTF текста в CP1251 кодировке, а не наоборот.

    Так что проверяйте nginx. Что же касается других хостингов - проверьте в какой они кодировке, с cp1251 мало кто сейчас работает.

    То что отправка "не из скрипта" работает корректно - это как раз подтверждение указанной выше проблемы. Браузер получает страницу и META тэг и решает как рендерить, причем в разных случаях эта мета может перекрыть хидер от сервера, а некоторые браузеры на нее могут и забить. В AJAX нету секции head-meta, там только заголовки.
     
  7. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Это именно то, что приходит в скрипт из формы
    Нагуглил то, что JS скрипт не поддерживает cp1251 и потому в скрипт передаются данные только в кодировке utf-8
    Проблема решилась добавлением такой строки iconv('utf-8', 'windows-1251', $_POST['name'])
     
  8. omgh

    omgh Создатель

    Регистр.:
    22 сен 2013
    Сообщения:
    21
    Симпатии:
    13
    Также можно отправлять данные закодированные, например, в base64. При приёме декодировать и всё норм.
     
    Agreas нравится это.