2012-01-13 20 views
-1

私はこのシンプルな問い合わせフォームを持っています例えば、à à à ùòèòòòèà èà à òのように、私が送られたメッセージを含んでいます。奇妙なエンコーディングの問題

フォームのみを含むページにフォームを抜粋し、そのページからのメッセージが変更なしで自分のメールに届きました。少し実験したところ、問題の原因は実際には動作させるタグ<meta charset="utf-8">であることが判明しました。

他のページはユニコード文字を使用しているため、このタグなしでは行けませんが、フォームの出力と競合します。私は何をすべきか?ここで


は、電子メールここ

<?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' => '[email protected]', 
     '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.'); 
    } 

を送ることを担当するPHPスクリプトのコードだ例があります:私は私のページを介してメッセージを送信する場合
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の両方で発生します。

+0

これはあなたのフォームではなく、あなたのメール送信メカニズムに関するものです。 – bmargulies

+0

いいえ、そうではありません。メタタグなしでページからメッセージを送信すると、正常なメールが返されます。メタタグを追加すると、それらのシンボルが表示されます。 –

+0

何かのエンコーディングを指定する必要があります。テキストを解釈するエンコーディングと、エンコーディングでサーバーにテキストを送信する必要のあるエンコーディングをブラウザに指示するメタ情報を設定する必要があります。同じことが電子メールにも当てはまりますが、電子メールクライアントにメールのエンコーディングを知らせるヘッダーを設定する必要があります。 – deceze

答えて

2

体と被験者のためにutf8_encodeを取り除く!ブラウザからのデータはすでにUTF-8になっています。からLatin-1(これはutf8_encode)に変換する必要はありません。

あなたはまた、そのエンコーディングを指定するメッセージに適切なヘッダを追加する必要があります

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

あなたはマジックをオンに引用していない限り、身体上のstripslashesの必要もありません、あなたはむしろべき場合にはマジッククォートを無効にします。