Форма PHP отображает кириллицу в виде вопросительных знаков при отправке сообщения электронной почты

У меня есть контактная форма на моем веб-сайте, которая использует PHP для выполнения своей работы. Проблема в том, что когда вы отправляете сообщение, написанное кириллическими символами, я получаю только кучу вопросительных знаков.

Вот код этой формы ниже:

<?php header('Content-Type: text/html; charset=utf-8');
      header('Content-Transfer-Encoding: 8bit');
if(isset($_POST['email'])){
        $mailTo = "[email protected]";
        $subject = "mail from web";
        $body = "New message from web
<br><br>
FROM: ".$_POST['email']."<br>
NAME: ".$_POST['name']."<br>
SUBJECT: ".$_POST['subject']."<br>
COMMENTS: ".$_POST['message']."<br>";   
        $headers = "To: Ameli Cakes <".$mailTo.">\r\n";
        $headers .= "From: ".$_POST['author']." <".$_POST['email'].">\r\n";
        $headers .= 'Content-Type: text/HTML; charset=utf-8' . "\r\n";
        $headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";
        //envio destinatario
        $mail_success =  mail($mailTo, $subject, $body, $headers);      
}
?>

Имейте в виду, что мои знания PHP очень ограничены, и я не являюсь автором этого фрагмента кода.

Я полагаю, что HTML страницы имеет соответствующий метатег, вы можете проверить его ниже:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Сам файл PHP тоже закодирован как utf-8 (проверено с помощью notepad++).

Ниже приведен пример того, что происходит:

Я отправил через форму сообщение

Это не кириллический текст, теперь следует какой-то кириллический текст. Поздрави другар!

И я получаю

Это не кириллический текст, теперь следует какой-то кириллический текст. Поздрави другар!!

Я был бы очень признателен за любую помощь, которую вы можете мне оказать в решении этой проблемы, большое спасибо за ваше время на чтение этого.

PS: ИСПРАВЛЕНО!! проверьте приведенный выше код, чтобы увидеть, как он наконец сработал.


person Nipponshin    schedule 05.10.2015    source источник
comment
Возможный дубликат Кодирование электронной почты PHP?   -  person CBroe    schedule 06.10.2015


Ответы (2)


Вам нужно два заголовка в вашем электронном письме.

Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit

В вашем коде было бы что-то вроде этого:

$headers .= "Content-Type: text/html; charset=utf-8";
$headers .= "Content-Transfer-Encoding: 8bit";

P.S.
Стрим

D0 9F D0 BE D0 B7 D0 B4 D1 80 D0 B0 D0 B2 D0 B8 20 D0 B4 D1 80 D1 83 D0 B3 D0 B0 D1 80 21 21

Поздрави другар!! ← как UTF-8

Поздрави другар!! ← как Windows-1251

person Michas    schedule 05.10.2015
comment
@qirel Я добавил второй заголовок следующим образом: header('Content-Type: text/html; charset=utf-8'); header('Content-Transfer-Encoding: 8bit'); Но проблема не устранена, спасибо за помощь! - person Nipponshin; 06.10.2015
comment
Я получаю это по электронной почте. Я больше не получаю вопросительные знаки после того, как последовал советам @Qirel, теперь я получаю Поздрави другар! когда я должен получить Поздрави другар!. после удаления функции utf8_decode(). Я обновлю пост, чтобы отразить это. - person Nipponshin; 06.10.2015
comment
Это были заголовки электронной почты. Если вы используете функцию mail, header ничего не устанавливайте в электронном письме. - person Michas; 06.10.2015
comment
Исправлено, спасибо за помощь! Проверьте код в исходном сообщении, чтобы увидеть, как он выглядит теперь, когда он работает. @Qirel большое спасибо за вашу помощь! - person Nipponshin; 06.10.2015

Важно, чтобы ваш весь код имел одинаковую кодировку, чтобы избежать проблем с неправильным отображением символов.

Есть несколько настроек, которые необходимо правильно определить, и я настоятельно рекомендую UTF-8 (как вы уже установили в своем HTML), так как в нем есть большинство необходимых вам букв (скандинавский, греческий, арабский).

Ниже я составил небольшой список вещей, которые должны быть установлены для определенной кодировки.

Заголовки

  • Установка кодировки в заголовках HTML и PHP на UTF-8

    • PHP: header('Content-Type: text/html; charset=utf-8');
      (заголовки PHP должны быть размещены перед любым выводом (эхо, пробелы, HTML)!)

    • HTML: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      (HTML-заголовки размещаются внутри тега <head> / </head>)

Кодировка файлов

  • Также важно, чтобы сам .php-файл был в кодировке UTF-8. Если вы используете Notepad++ для написания кода, это можно сделать в раскрывающемся списке «Формат» на панели задач.

Вы можете взглянуть на этот пост StackOverflow: UTF-8 полностью.

person Qirel    schedule 05.10.2015
comment
Привет, спасибо за ответ, я обновил пост с вашими советами. Код PHP был обновлен заголовком, но проблема не устранена, метатег в HTML находится внутри тега заголовка, а файл PHP закодирован как utf-8. проверил блокнотом++. - person Nipponshin; 06.10.2015
comment
Вы также должны удалить utf8_decode(). В руководстве указано, что он преобразует UTF-8 в однобайтный ISO-8859-1. Кроме того, ваш файл закодирован с помощью UTF-8 w/o BOM или UTF-8? Он должен быть первым (без спецификации). - person Qirel; 06.10.2015
comment
Notepad ++ говорит, что это UTF-8 без спецификации, я обновил код, как было предложено, и все еще не работает, но есть изменение. Знаки вопроса исчезли, а вместо них появился вот этот Поздрави другар!, он все равно не тот, что должен быть (проверьте исходный пример), спасибо! - person Nipponshin; 06.10.2015
comment
Если вы echo $_POST['email']; (до отправки), правильно ли он закодирован? Потому что это должно быть, если ваши заголовки установлены и файл правильно закодирован. - person Qirel; 06.10.2015
comment
Я не уверен, что вы просите меня сделать... Мои знания PHP очень плохи, извините. Должен ли я добавить это куда-нибудь в код? Я получаю синтаксическую ошибку, когда я это делаю. - person Nipponshin; 06.10.2015
comment
Поместите echo $_POST['message']; выше $mailTo = "[email protected]";, например (если вы получаете синтаксическую ошибку, вы делаете что-то не так). А затем отправьте письмо — вы должны увидеть эхо, и оно должно быть правильно закодировано. Если это не так, я не знаю, почему (поскольку заголовки и файл закодированы, как вы утверждаете). - person Qirel; 06.10.2015
comment
Привет, я добавил код, как вы сказали, и у меня нет синтаксических ошибок, но я не вижу эха, когда использую форму для отправки электронного письма, где это должно появиться? - person Nipponshin; 06.10.2015
comment
Echo означает, что он напечатает текст для браузера, и если вы хотите выяснить, где, поместите в него какой-нибудь текст, например echo "Message from POST is: ".$_POST['message'];, и он должен быть там, где сообщение от POST находится на вашем веб-сайте после того, как вы отправили почту. - person Qirel; 06.10.2015
comment
Привет, я обновил код, как вы сказали, но я действительно не вижу никакого эха, или я просто слишком туп, чтобы понять, что я должен делать :/. Мой веб-сайт amelicakes.com, если вы хотите его проверить. (проверьте исходный пост, чтобы увидеть, как сейчас выглядит файл PHP). - person Nipponshin; 06.10.2015
comment
echo означает печатать текст. Поэтому он должен быть где-то в вашем браузере, когда вы отправляете письмо (ищите лишний текст, если вы не можете найти его напрямую). - person Qirel; 06.10.2015
comment
Исправлено! Большое спасибо за помощь! Проверьте код в оригинальном посте, чтобы увидеть, как он выглядит теперь, когда он работает :). - person Nipponshin; 06.10.2015