PHP,mySQL和电子邮件中的字符集

时间:2013-11-05 18:31:10

标签: php mysql email character-encoding

字符集让我绕过弯道!

我的数据库是utf8_general_ci,其中的表格是utf8_unicode_ci。 我的所有PHP页面都有

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

在头部。

当我在PHP页面中键入欧元符号(€)并将其输入到数据库时,它在phpMyAdmin中显示为â, 当我使用PHP页面从数据库中复制它时,它再次显示为€

到目前为止一切顺利,但是当我使用PHP编写html电子邮件时,无论我做什么,它都会在电子邮件中显示为â, 我已经尝试在html电子邮件中指定字符集,但它不起作用。可能是因为电子邮件客户端从邮件服务器而不是标题中获取其字符集。 我也遇到了重音字母之类的问题,但是它们被写入文本中,所以我可以通过使用é来克服它们,等等。凌乱,但并非不可能。

当然有更好的方法!

我的解决方案(排序)

感谢所有贡献者。我已经尝试了所有方法将字符集指定为utf-8(在邮件头中,在html头中,以及两者)但是消息仍然以iso的形式到达。所以我从其他地方得到的信息似乎是正确的:字符集是由服务器定义的。

每次我想要é进入固定文本时,我不得不满足于输入类似é的东西,这很麻烦,但至少它有用。

对于欧元符号,我已将变量包装在htmlentities函数中。它可以工作,但如果我遇到类似文件中的类似问题,我将不得不记住从数据库中获取的任何其他变量。将函数包装在整个html主体周围会更容易,但这不起作用,大概是因为它对它做了有趣的事情。

3 个答案:

答案 0 :(得分:0)

检查文本编辑器中的编码。如果这是错误的话,会发生疯狂的事情!

对于MySQL,请参阅mysql_set_charset

电子邮件实际上是从Content-Type标题中获取字符集,而不是从电子邮件服务器获取。确保将此标头设置为适当的值,例如Content-Type: text/html; charset="UTF-8"。另请参阅this question

请注意,对于HTML,您可以$encoded = htmlentities( $string, ENT_QUOTES, 'utf-8' )使用all characters which have HTML character entity equivalents are translated into these entities

答案 1 :(得分:0)

我想你的正确答案就是为电子邮件设置utf-8字符集:

$headers = "MIME-Version: 1.0\r\n";
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";
$headers.= "Content-Type: text/plain;charset=utf-8\r\n";
$headers.= "Reply-To: $reply\r\n";  
$headers.= "X-Mailer: PHP/" . phpversion();
mail($to, $s, $body, $headers);

答案 2 :(得分:0)

如果您在客户端中打开电子邮件源(在thunderbird中使用ctrl + u)。您将看到Content-Type标头。这应该是这样的:

Content-Type: text/html; charset=utf-8

如果您的电子邮件包含多个部分,则需要将该标题添加到html部分。

标题值需要单独编码(每行)。

Subject: =?utf-8?B?...?=

对于html内容,您只需使用htmlentities(),但这不适用于标题或文本电子邮件。