如何为PHP添加UTF-8支持?

时间:2012-11-02 22:25:50

标签: php utf-8

如何为此PHP文件添加UTF-8支持?这样文本就会出现乱码。 我尝试添加一些我在网上找到的代码,但它没有用......

这是我的原始代码。问题是为UTF-8支持添加什么。

<?php
/*
This first bit sets the email address that you want the form to be submitted to.
You will need to change this value to a valid email address that you can access.
*/

$webmaster_email = "natalie@cakery.co.il";

/*
This bit sets the URLs of the supporting pages.
If you change the names of any of the pages, you will need to change the values here.
*/
$feedback_page = "contact.html";
$error_page = "thanks.html";
$thankyou_page = "thanks.html";

/*
This next bit loads the form field data into variables.
If you add a form field, you will need to add it here.
*/
$Name1 = $_REQUEST['Name1'] ;
$Name2 = $_REQUEST['Name2'] ;
$Phone = $_REQUEST['Phone'] ;
$email_address = $_REQUEST['email_address'] ;
$comments = $_REQUEST['comments'] ;

/*
The following function checks for email injection.
Specifically, it checks for carriage returns - typically used by spammers to inject a CC list.
*/
function isInjected($str) {
    $injections = array('(\n+)',
    '(\r+)',
    '(\t+)',
    '(%0A+)',
    '(%0D+)',
    '(%08+)',
    '(%09+)'
    );
    $inject = join('|', $injections);
    $inject = "/$inject/i";
    if(preg_match($inject,$str)) {
        return true;
    }
    else {
        return false;
    }
}

// If the user tries to access this script directly, redirect them to the feedback form,
if (!isset($_REQUEST['email_address'])) {
header( "Location: $feedback_page" );
}

// If the form fields are empty, redirect to the error page.
elseif (empty($email_address) || empty($comments)) {
header( "Location: $error_page" );
}

// If email injection is detected, redirect to the error page.
elseif ( isInjected($email_address) ) {
header( "Location: $error_page" );
}

// If we passed all previous tests, send the email then redirect to the thank you page.
else {
mail( "$webmaster_email", "Feedback Form Results",
  $comments, "From: $email_address" );
header( "Location: $thankyou_page" );
}
?>

1 个答案:

答案 0 :(得分:4)

您希望发送符合UTF8标准的电子邮件,然后我您可以尝试在发送电子邮件之前对$comments进行UTF8编码:

$comments = utf8_encode($comments);

无法保证,因为这完全取决于您的应用程序(特别是收集这些评论的部分)是如何工作的,它已经使用了什么编码,以及{{1本身是建立的。

$comments(以及我的建议)根据假设进行操作,您看到“乱码”的原因是您实际上是以UTF为幌子发送Latin1编码8;但是你的问题可能会有所不同,而且没有看utf8_encode(最重要的是,$comments十六进制转储),猜测是任何人都可以做的最好的

另一种可能性(正好相反)是你将未经广告的UTF8发送给将其解码为ISO-8859-15的人。在这种情况下,您应正确宣传重新编码内容的内容类型,而不是,并将proper extra headers添加到$comments功能。

我推荐deceze的链接,即使第二个可能看起来因为它将我的建议归类为“虚假承诺”: - )

更新

好的,让我们说运行

mail()

让你变得奇怪。以上来自某种形式;您需要检查显示该表单的页面的编码。假设您已在“Name1”字段中输入值“Léon”。然后,如果您在上面添加指令

$Name1 = $_REQUEST['Name1'];

接收页面应该终止并显示十六进制字符串。如果在UTF8中正确接收到名称,则应该说die(bin2hex($Name1)); 。但是如果您运行的是ISO-8859-15,您将看到4cc3a96f6e,这意味着您需要更改传输表单的编码(以便它传输良好的UTF8),或者您必须4ce96f6e 1}}输入:

utf8_encode

当然,您可能也会收到陌生人的十六进制代码:$Name1 = utf8_encode($_REQUEST['Name1']); ,也许。

如果您收到4c826f6e 但仍然无效,则问题是在传输表单或接收PHP中,但稍后。例如,当您显示字符串时。 页面可能采用ISO-8859-15编码,输出良好的UTF8将无效。如果是这种情况,您应该通过提供

来更改输出页面的广告编码
4cc3a96f6e

如果该页面中的其他文本显示为中断,则表示该页面已由ISO-8859-15编辑器编辑;所以它包含ISO-8859-15特殊字符,你可以正确看到ISO编码,但转换到UTF-8时没有更多。在这种情况下,您需要在其他所有内容之前转换文件,并从现在开始使用UTF编辑器。