使用html2text函数出现字符丢失问题,求解决方案
解决html2text转换UTF-8字符丢失的问题
看起来你遇到的是html2text对法语重音字符和撇号处理不当的问题,我之前也碰到过类似情况,下面是几个亲测有效的解决思路:
1. 显式设置html2text的字符集为UTF-8
很多旧版的html2text类默认使用ISO-8859-1编码,这会导致UTF-8的重音字符被错误过滤。你可以尝试在初始化时强制指定UTF-8:
// 方法1:如果你的html2text支持构造函数传参数 $h2t = new html2text($leMessage, array('charset' => 'UTF-8')); // 方法2:如果是经典的Jon Abernathy版html2text,直接设置属性 $h2t = new html2text($leMessage); $h2t->charset = 'UTF-8'; // 关键:告诉工具输入是UTF-8编码 $altBody = $h2t->get_text();
2. 确保输入的HTML本身是UTF-8编码
如果$leMessage的原始编码不是UTF-8(比如是ISO-8859-1),html2text也会处理出错。先检测并转换输入编码:
// 检测输入编码 $inputEncoding = mb_detect_encoding($leMessage, array('UTF-8', 'ISO-8859-1', 'Windows-1252')); // 如果不是UTF-8,转换过来 if ($inputEncoding !== 'UTF-8') { $leMessage = mb_convert_encoding($leMessage, 'UTF-8', $inputEncoding); } // 再进行转换 $h2t = new html2text($leMessage); $h2t->charset = 'UTF-8'; $altBody = $h2t->get_text();
3. 去掉不必要的utf8_decode调用
你代码里对sujet用了utf8_decode,如果sujet本身已经是UTF-8编码,这个函数会把它转成ISO-8859-1,反而会导致重音字符丢失或乱码。建议直接去掉:
// 替换原来的日志调用 logMessagePreformate($id_dossier, $sujet, $altBody, $pour1, $pour2);
如果确实需要处理sujet的编码,先检测它的编码再决定是否转换。
4. 更换维护更好的html2text库
如果用的是比较老旧的html2text实现,可能对UTF-8的支持不够完善。推荐使用Composer上的html2text/html2text包,它对多语言字符支持更好:
# 先通过Composer安装 composer require html2text/html2text
然后使用:
use Html2Text\Html2Text; // 初始化时指定UTF-8 $htmlConverter = new Html2Text($leMessage, ['charset' => 'UTF-8']); $altBody = $htmlConverter->getText();
5. 临时 workaround:先解码HTML实体
如果以上方法都不行,可以在转换前先把HTML实体(比如é)转成真实的UTF-8字符:
$leMessage = html_entity_decode($leMessage, ENT_QUOTES, 'UTF-8'); $h2t = new html2text($leMessage); $h2t->charset = 'UTF-8'; $altBody = $h2t->get_text();
为什么之前的utf8_encode/mb_convert_encoding没用?
因为问题出在html2text处理过程中没有正确识别UTF-8字符,导致转换时直接丢弃了重音部分。你之前是在转换后处理文本,这时候丢失的字符已经找不回来了,所以必须在输入阶段和工具配置上下功夫。
内容的提问来源于stack exchange,提问作者Jihane
相关产品推荐
相关产品推荐

