【问题标题】:Incorrect encoding with Cyrillic in PHP contact formPHP 联系表单中的西里尔字母编码不正确
【发布时间】:2013-04-11 11:01:04
【问题描述】:

我是 PHP 和表单的新手,如果有人愿意提供帮助,我将不胜感激。

我有一个联系表格,但它没有正确发送任何西里尔字符。我知道我必须将Content-type: text/plain; charset=UTF-8 放在代码中的某个位置,但我不知道确切地放在哪里。表单元素设置为在UTF-8 中发布,但它似乎无法与 PHP 文件一起正常工作。

error_reporting(E_ALL ^ E_NOTICE);

$my_email = "myemailaddress@mail.com";
$from_email = "";
$continue = "index.php";
$errors = array();
// Remove $_COOKIE elements from $_REQUEST.
if (count($_COOKIE)) {
  foreach(array_keys($_COOKIE) as $value) {
    unset($_REQUEST[$value]);
  }
}
// Validate email field.
if (isset($_REQUEST['email']) && !empty($_REQUEST['email']) && !empty($_REQUEST['family']) && !empty($_REQUEST['about'])) {
  $_REQUEST['email'] = trim($_REQUEST['email']);
  if (substr_count($_REQUEST['email'], "@") != 1 || stristr($_REQUEST['email'], " ")) {
    $errors[] = "Email address is invalid";
  } else {
    $exploded_email = explode("@", $_REQUEST['email']);
    if (empty($exploded_email[0]) || strlen($exploded_email[0]) > 64 || empty($exploded_email[1])) {
      $errors[] = "Email address is invalid";
    } else {
      if (substr_count($exploded_email[1], ".") == 0) {
        $errors[] = "Email address is invalid";
      } else {
        $exploded_domain = explode(".", $exploded_email[1]);
        if (in_array("", $exploded_domain)) {
          $errors[] = "Email address is invalid";
        } else {
          foreach($exploded_domain as $value) {
            if (strlen($value) > 63 || !preg_match('/^[a-z0-9-]+$/i', $value)) {
              $errors[] = "Email address is invalid";
              break;
            }
          }
        }
      }
    }
  }
}
// Check referrer is from same site.
if (!(isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']) && stristr($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']))) {
  $errors[] = "You must enable referrer logging to use the form";
}
// Check for a blank form.
function recursive_array_check_blank($element_value) {
  global $set;
  if (!is_array($element_value)) {
    if (!empty($element_value)) {
      $set = 1;
    }
  } else {
    foreach($element_value as $value) {
      if ($set) {
        break;
      }
      recursive_array_check_blank($value);
    }
  }
}
recursive_array_check_blank($_REQUEST);
if (!$set) {
  $errors[] = "You cannot send a blank form";
}
unset($set);
// Display any errors and exit if errors exist.
if (count($errors)) {
  foreach($errors as $value) {
    print "$value<br>";
  }
  exit;
}
if (!defined("PHP_EOL")) {
  define("PHP_EOL", strtoupper(substr(PHP_OS, 0, 3) == "WIN") ? "\r\n" : "\n");
}
// Build message.
function build_message($request_input) {
  if (!isset($message_output)) {
    $message_output = "";
  }
  if (!is_array($request_input)) {
    $message_output = $request_input;
  } else {
    foreach($request_input as $key = > $value) {
      if (!empty($value)) {
        if (!is_numeric($key)) {
          $message_output. = str_replace("_", " ", ucfirst($key)).
          ": ".build_message($value).PHP_EOL.PHP_EOL;
        } else {
          $message_output. = build_message($value).
          ", ";
        }
      }
    }
  }
  return rtrim($message_output, ", ");
}
$message = build_message($_REQUEST);
$message = $message.PHP_EOL.PHP_EOL.
"-- ".PHP_EOL.
"Thank you for using the contact form.";
$message = stripslashes($message);
$subject = $_REQUEST['about'];
$subject = stripslashes($subject);
if ($from_email) {
  $headers = "From: ".$from_email;
  $headers. = PHP_EOL;
  $headers. = "Reply-To: ".$_REQUEST['email'];
} else {
  $from_name = "";
  if (isset($_REQUEST['name']) && !empty($_REQUEST['name'])) {
    $from_name = stripslashes($_REQUEST['name']);
  }
  $headers = "From: {$from_name} <{$_REQUEST['email']}>";
}
mail($my_email, $subject, $message, $headers); ?> 



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
  <head>
    <title>Your mail has been sent!</title>
    <meta http-equiv="Content-Type" content="text/html; charset = utf - 8 ">
    <link rel="stylesheet" type="text/css" href="css/style.css"/>
  </head>
  <body>
    <div>
      <center>
        <b>Thank you <?php if(isset($_REQUEST['name'])){print stripslashes($_REQUEST['name']);} ?></b>
        <br>Your mail has been sent!
        <p><a href="<?php print $continue;?>">Click here to continue</a></p>
      </center>
    </div>
  </body>
</html>

【问题讨论】:

    标签: php forms character-encoding contact


    【解决方案1】:

    Добави това:

        $headers = "From: " . $from_email;
        $headers .= PHP_EOL;
        $headers .= "Reply-To: " . $_REQUEST['email'];
        //новия код (new code)
        $headers .= "MIME-Version: 1.0"."\r\n" ."Content-type: text/plain; charset='utf-8'". "\r\n";
    

    Няма да е лошо да сложиш и някаква форма на верификация (картинка с код примерно, който трябва да се въведе, т.нар. CAPTCHA code) преди пращане от юзера, иначе всеки спам бот ще ти ползва формата за пращане на мейли , порови тук има доста начини за справяне с проблема。

    翻译:(在发送电子邮件之前放置某种验证码,其中包含代码的图像,所谓的 CAPTCHA 是不错的主意,因为否则每个来自互联网的垃圾邮件机器人都会使用您的表单进行邮寄,在这里查看更多解决问题的方法。)

    【讨论】:

    • 我在你的帖子之前纠正了自己(我也不知道我的评论去了哪里:/)。 blog.stackoverflow.com/2009/07/non-english-question-policy
    • Stack Overflow 是一个只有英文的网站,所以我们确实需要用英文提问和回答。您能否至少提供您的答案的并排英文翻译?
    • 不要使用PHP_EOL 分隔标题。邮件标题必须用完整的"\r\n" 分隔,而在某些系统上,PHP_EOL 只是"\r"。 (在其他系统上,PHP_EOL"\r\n"。它会有所不同。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多