导入邮件XML至MySQL TEXT字段出现异常字符问题求助
解决方案:邮件XML内容中的奇怪字符问题
你看到的=3D、=0D=0A是Quoted-Printable编码的转义字符,和UTF-8/UTF-16编码无关。Quoted-Printable是邮件系统常用的编码方式:
=3D是等号(=)的转义(等号的ASCII码十六进制为3D)=0D=0A是回车换行符(\r\n)的转义
你的脚本直接读取了编码后的原始内容,没有解码,所以这些转义字符被直接存入了数据库。以下是具体解决步骤:
1. 基础修复:解码Quoted-Printable内容
PHP自带quoted_printable_decode()函数,专门处理这种编码。在你获取到$message变量后,直接添加解码逻辑:
// 原代码中获取完$message后,添加解码 $message = quoted_printable_decode($message);
2. 严谨处理:根据邮件头判断编码类型
不是所有邮件都用Quoted-Printable,建议先从邮件头中提取传输编码,再针对性处理:
// 在解析邮件头的循环中,新增获取传输编码的逻辑 $transfer_encoding = ''; if (preg_match("/^Content-Transfer-Encoding: (.*)/i", $lines[$i], $matches)) { $transfer_encoding = strtolower(trim($matches[1])); } // 解析完内容后根据编码处理 if ($transfer_encoding === 'quoted-printable') { $message = quoted_printable_decode($message); } elseif ($transfer_encoding === 'base64') { // 处理Base64编码的邮件内容 $message = base64_decode($message); }
3. 统一编码:转成UTF-8存入数据库
即使解码后,邮件内容可能使用其他编码(比如GBK),需要统一转成UTF-8:
// 在解析邮件头时,提取内容编码 $charset = 'UTF-8'; // 默认UTF-8 if (preg_match("/^Content-Type:.*charset=([^\s;]+)/i", $lines[$i], $matches)) { $charset = strtoupper(trim($matches[1])); } // 将内容转码为UTF-8 if ($charset !== 'UTF-8' && mb_check_encoding($message, $charset)) { $message = mb_convert_encoding($message, 'UTF-8', $charset); }
4. 数据库端配置
- 连接数据库时执行
SET NAMES utf8mb4;,确保连接字符集为utf8mb4(支持所有Unicode字符) - 存储XML的字段(TEXT/LONGTEXT)设置字符集为
utf8mb4,避免编码不匹配导致的乱码
内容的提问来源于stack exchange,提问作者CJ Broersma
相关产品推荐
相关产品推荐

