【问题标题】:PHP and Russian LettersPHP 和俄语字母
【发布时间】:2011-01-08 21:18:27
【问题描述】:

当通过 PHP 请求发送到...邮件时,俄罗斯字母会发生什么情况,例如? “硬编码”俄语字母显示正确,但来自带有象形文字的表单文本框:

HTML 页面:

<tr>
 <td style="width: 280px">Содержание работ</td>
 <td><input type="text" id="workContent"/></td>
</tr>

PHP 页面:

$WorkContent = $_REQUEST["workContent"]; //Содержание работ
// ...
$WorkContentLabel = "Содержание работ";
// ...
$message .= $WorkContentLabel . ":\t" . $WorkContent . "\n";
// ...
// email stuff (data below changed)
$to = "test@gmail.com";
$from = "me@domain.com";
$from_header = "From: Russian site command ";

$subject = "Message with russian letters";
$subject = '=?utf-8?B?'.$subject.'?=';
$message .= $subject;

// send message
mail($to, $subject, $message, $from_header);

用户在文本框中输入一些内容: alt text http://lh3.ggpht.com/_1TPOP7DzY1E/S1y6Y0wb9tI/AAAAAAAAC88/OkdMQkO47HQ/s800/works.png

然后提交表单。

我会收到什么(在 GMAIL 中):

Содержание работ:       1)Содержание 2)RABOT

所以,硬编码俄语文本 - 好的,通过表单发送 俄语文本 - NOK,通过表单发送 ASCII 文本 - 好的。

有人知道编码出现这种奇怪行为的原因可能是什么吗?

编辑: 用过

$subject = "  оборудования  - subject with russian letters";
$subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
$message .= $subject;

获得一个主题,如 �����������ÿ - subject with russian letters http://lh6.ggpht.com/_1TPOP7DzY1E/S1zFqFe9ohI/AAAAAAAAC9E/PZ7C4JtEHTU/s800/subject.png

【问题讨论】:

    标签: php utf-8 character-encoding internationalization ascii


    【解决方案1】:

    你需要base64_encode()你的$subject,像这样:

    $subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
    

    确保您还保存了编码为 UTF-8 无 BOM 的 .php 文件


    您可能也对这个问题感兴趣:Is this the correct way to send email with PHP?

    【讨论】:

    • 使用$subject = '=?UTF-8?B?' . base64_encode($subject) . '?='; 将 PHP 文档保存为 UTF-8,现在一切正常!非常感谢!
    【解决方案2】:

    检查您的编码:

    1. HTML 编码(在&lt;meta http-equiv..&gt; 标签中)
    2. PHP/HTML/模板文件编码(编辑器保存文件的编码)
    3. 数据库编码(如果适用)(表中数据的编码方式)
    4. 数据库连接编码(如果适用)(数据库连接使用什么编码)

    一切都使用 UTF-8。

    【讨论】:

    • 不要忘记电子邮件标题。
    • 您还应该将这一行添加到您的 PHP 脚本中: header('content-type: text/html; charset: utf-8');
    【解决方案3】:

    除了 Alix 在主题行的 RFC2047 编码字中所说的 base64 之外,您还需要通过添加标题来告诉邮件程序在邮件正文中期望 UTF-8 编码的文本:

    MIME-Version: 1.0
    Content-Type: text/plain;charset=utf-8
    

    否则由邮寄者来猜测,可能是错误的。

    【讨论】:

    • 邮件正文,你的意思是$message吗?如何添加此标头?
    • 是的,$message 在正文中。使用additional_headers 参数添加标题,与设置From: 的方式相同。例如。 $headers= "From: Russian site command\r\nMIME-Version: 1.0\r\nContent-Type: text/plain;charset=utf-8".
    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多