0

字符集正在驱使我转弯!

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

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

在头上。

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

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

肯定有更好的办法!

我的解决方案(排序)

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

每次我想将 é 输入固定文本时,我都不得不满足于输入诸如 é 之类的东西,这很麻烦,但至少它有效。

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

4

3 回答 3

0

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

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

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

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

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

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

于 2013-11-05T18:56:21.613 回答
0

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

对于 MySQL,请参阅mysql_set_charset

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

并且请记住,对于 HTML,您可以使用$encoded = htmlentities( $string, ENT_QUOTES, 'utf-8' )以便将具有 HTML 字符实体等效项的所有字符转换为这些实体

于 2013-11-05T18:51:19.337 回答
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);
于 2013-11-05T18:52:34.080 回答