Странные проблемы с кодировкой в ​​html-контактной форме и в кодировке utf8 через метатег - PullRequest
0 голосов
/ 13 января 2012

У меня есть эта простая контактная форма:

<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.

1 Ответ

2 голосов
/ 13 января 2012

Избавьтесь от utf8_encode для тела и предмета!Ваши данные уже находятся в UTF-8, когда они поступают из браузера, вам не нужно конвертировать их из Latin-1 в UTF-8 (что и делает utf8_encode).

Вы также должны добавить к сообщению правильные заголовки, которые обозначают его кодировку:

'headers' => 'From: "' . $data['name'] . '" <' . $data['email'] . ">\r\n" .
             "MIME-Version: 1.0\r\n" .
             'Content-type: text/plain; charset=utf-8'

Также нет необходимости в stripslashes на теле, , если у вас не включены магические кавычкив этом случае вам лучше отключить магические кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...