html联系表单的奇怪编码问题和通过元标记的utf8编码

时间:2012-01-13 00:51:35

标签: html forms unicode utf-8

我有这个简单的联系表格:

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

如果邮件包含像àèìòù这样的unicode字符,当我收到包含我已发送邮件的电子邮件时,它们会以奇怪的方式显示,例如à à à ùòèòòòèà èà à ò

我将表单摘录到仅包含表单的页面,来自该页面的邮件到达了我的电子邮件,没有任何修改。经过一些实验,我发现问题的原因是标签<meta charset="utf-8">,实际上应该让事情发挥作用。

由于其他页面使用unicode字符,我不能没有这个标签,但它会与我的表单输出冲突。我该怎么办?


这是负责发送电子邮件的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 个答案:

答案 0 :(得分:2)

摆脱身体和主题的utf8_encode!当您的数据来自浏览器时,您的数据已经是UTF-8,您无需从Latin-1转换为UTF-8(这是utf8_encode所做的)。< / p>

您还应该在指定其编码的消息中添加适当的标头:

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

身体上也不需要stripslashes ,除非你有魔术行情,在这种情况下你应该停用Magic Quotes。