我有一个可以提交西班牙语并使用PHP的表单,我发送了一封包含数据的电子邮件。 不幸的是,重音符号在收到电子邮件时完全搞砸了。
如果我提交以下内容:
测试重音符号 á é í ó ú ñ
我最终在我的电子邮件正文中得到了以下内容......
测试重音符号 ±©
处理电子邮件的代码只是将 $_POST 信息直接放入电子邮件正文中。 我假设我需要有 htmlentities() 或其他东西,但我已经尝试过,没有任何效果......
我还需要将相同的数据放入MySQL数据库中,并在以后检索它。 当我这样做时,我需要注意什么?
谢谢!提请
你已经触及了字符集这个很好的主题。尝试创建所有内容并将其转换为 utf-8。数据库、文件、表单等。在互联网上查找一些有关在电子邮件中使用什么标头以使其成为 utf-8 的信息。还可以使用这些标头将您的电子邮件从标准 7 位转换为 8 位。
"Content-Type: text/plain; charset=utf-8"
"Content-Transfer-Encoding: 8bit"
对于数据库,您需要设置排序规则,如果是 mysql。
要回答有关在数据库中存储数据的问题,请执行以下操作:
使用 mysql_connect() 打开与 MySQL 的连接后,发送以下查询作为第一个命令:
mysql_query("SET NAMES utf8");
(或 mysqli_query(),具体取决于您使用的库)。
此命令让 MySQL 数据库知道:
- 您将提供的所有数据都将是编码为 UTF-8,以及
- 您还希望以 UTF-8 格式接收所有内容。
严格来说,数据库本身可以是任何排序和编码(MySQL很乐意为您即时转码),但是当然,最好也使用UTF-8数据库。
如果你使用的是 utf8 主题,你需要先对它们进行 base64 编码:
$subject = "=?utf-8?b?".base64_encode($subject)."?=";
并按如下方式设置内容类型:
$headers.="Content-Type: text/html; charset=utf-8'r'n";
我还建议您使用像SwiftMailer这样的系统来防止标头注入攻击。对于数据库部分,我认为最好将其作为一个单独的问题来获得适当的标签和更有针对性的响应。
您的脚本正在接收以 UTF-8 编码的数据,但您的电子邮件客户端认为电子邮件以拉丁语 1 编码。有两种方法可以解决此问题:在电子邮件中添加一个标头,指示字符编码为 UTF-8,或者对提交的内容使用 utf8_decode()
(如果您确定只会使用拉丁语 1 字符)。