У меня есть эта простая контактная форма:
<form id="emailForm" action="contact.php" method="POST">
<label for="name">Your name</label>
<input type="text" id="name" name="name">
<label for="email">Your email</label>
<input type="text" id="email" name="email">
<label for="subject">Subject</label>
<input type="text" id="subject" name="subject">
<label for="message">Message</label>
<textarea id="message" name="message"></textarea>
<p class="emailPop" id="emailError"></p>
<input id="submit" type="submit" value="Send">
</form>
Если сообщение содержит символы Юникода, такие как àèìòù
, они будут отображаться странным образом, когда я получу электронное письмо, содержащее отправленное сообщение, например, à à à ùòèòòòèà èà à ò
.
Я извлек форму на страницу, которая содержала только одну форму, и сообщения с этой страницы дошли до моего электронного письма без изменений. После нескольких экспериментов я обнаружил, что причиной проблемы является тег <meta charset="utf-8">
, который действительно должен заставить все работать.
Поскольку на других страницах используются символы Юникода, я не могу обойтись без этого тега, но он будет конфликтовать с выводом моей формы. Что мне делать?
Вот код php-скрипта, отвечающего за отправку электронного письма
<?php
//require_once 'Mail.php';
function exit_message($error) {
echo json_encode(array('status' => 'error', 'message' => $error));
exit();
}
$data = $_POST;
// Check that all fields are filled in
$fields = array('name', 'email', 'subject', 'message');
foreach($fields as $field) {
if(empty($data[$field]))
exit_message("Please insert your " . $field . '.');
}
// Check if email is valid
if(!filter_var($data['email'], FILTER_VALIDATE_EMAIL))
exit_message('The email you provided is invalid.');
// Check if message is longer than 9 characters
if(strlen($data['message']) <= 9)
exit_message('Please write a message at least 9 characters long.');
// Begin composing the message
$message = array(
'recipient' => 'xxxxxxx@gmail.com',
'subject' => $data['subject'],
'body' => stripslashes($data['message']) . ' - gabrielecirulli.com',
'headers' => 'From: "' . $data['name'] . '" <' . $data['email'] . '>'
);
// Send
if(mail(
$message['recipient'],
utf8_encode($message['subject']),
utf8_encode($message['body']),
$message['headers']
)) {
echo json_encode(array('status' => 'ok'));
} else {
exit_message('An unidentified error happened while sending your message.');
}
Вот пример: если я отправлю сообщение через мою страницу
http://www.gabrielecirulli.com/p/20120113-073417.png
и если я отправлю то же сообщение через тестовую страницу, на которой нет <meta charset="utf-8">
:
http://www.gabrielecirulli.com/p/20120113-073503.png
Вот результат:
http://www.gabrielecirulli.com/p/20120113-073737.png
Как видите, страница без метатега фактически дает правильные символы.
Эта проблема возникает как в Google Chrome, так и в Firefox.