提交表格中的西班牙口音标记

时间:2011-05-11 12:45:20

标签: php email internationalization diacritics

我有一个可以提交西班牙语并使用PHP的表单,我发送一封包含数据的电子邮件。不幸的是,当他们收到电子邮件时,重音标记完全搞砸了。

如果我提交以下内容:

  

测试重音标记   一个   é   一世   ó   ú   ñ

我的电子邮件正文中有以下内容......

  

测试重音标记áÃÃÃÃÃÃÃ

处理电子邮件的代码只是将$ _POST信息直接放入电子邮件正文中。我认为我需要有htmlentities()或者其他东西,但我已经尝试过但没有任何作用......

我还需要将相同的数据放入MySQL数据库并稍后检索。当我这样做时,我需要注意什么?

谢谢! 德鲁

4 个答案:

答案 0 :(得分:3)

你已经触及了charsets的优秀主题。尝试创建并将所有内容转换为utf-8。数据库,文件,表格等。在互联网上查找有关在电子邮件中使用哪个标头以使其成为utf-8的一些信息。同时使用这些标题将您的电子邮件从标准的7位转换为8位。

"Content-Type: text/plain; charset=utf-8"
"Content-Transfer-Encoding: 8bit"

对于数据库,您需要在mysql的情况下设置排序规则。

答案 1 :(得分:1)

回答有关在数据库中存储数据的问题:

使用mysql_connect()打开与MySQL的连接后,将以下查询作为第一个命令发送:

mysql_query("SET NAMES utf8");

(或mysqli_query(),具体取决于您使用的库)。

此命令允许MySQL数据库知道:

  • 您将提供的所有数据都将是 编码为UTF-8和
  • 您还希望以UTF-8收到所有内容。

严格来说,数据库本身可以采用任何排序规则和编码方式(MySQL很乐意为您动态转码),但当然,最好还是使用UTF-8数据库。

答案 2 :(得分:0)

如果你正在使用utf8主题,你需要首先对它们进行base64编码:

$subject = "=?utf-8?b?".base64_encode($subject)."?=";

并设置内容类型:

$headers.="Content-Type: text/html; charset=utf-8\r\n";

我还建议您使用SwiftMailer之类的系统来防止标头注入攻击。对于数据库部分,我认为最好将其作为一个单独的问题来获得正确的标签和更集中的响应。

答案 3 :(得分:0)

您的脚本正在接收以UTF-8编码的数据,但您的电子邮件客户端认为该电子邮件是使用Latin-1编码的。有两种方法可以解决这个问题:在电子邮件中添加标题,表示字符编码为UTF-8,或者在提交的内容上使用utf8_decode()(如果您确定只使用Latin-1)字符)。