PHP和俄罗斯字母

时间:2010-01-24 21:07:27

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

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

3 个答案:

答案 0 :(得分:9)

您需要base64_encode() $subject,如下所示:

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

确保您还将 .php文件保存为UTF-8编号为无BOM


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

答案 1 :(得分:3)

检查您的编码:

  1. HTML编码(在<meta http-equiv..>标记中)
  2. PHP / HTML /模板文件编码(编辑器保存文件的编码)
  3. 数据库编码(如果适用)(表中数据的编码方式)
  4. 数据库连接编码(如果适用)(用于数据库连接的编码)
  5. 并将UTF-8用于所有内容。

答案 2 :(得分:1)

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

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

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