0

好的,所以我们有一个脚本,它接收发送到 Thunderbird 的电子邮件,将部分消息转换为 html 并将其保存到 MySQL。每个文件,每个写入的部分都设置为 UTF-8。最后,在我的工作结束时,CRM(用 PHP5.3 编写,预期输出 Chrome 和 Firefox),我提取消息以及其他信息并显示类似于 GMail 的内容,但作为我们员工的“任务列表”。

我遇到的问题,如果你还没有猜到,一些客户的电子邮件显然使用不同的编码。因此,一些(不是全部,当然也不是大多数)电子邮件不能正确显示所有字符。

起初,我使用它utf8_encode来使电子邮件看起来正确,这有助于大多数来自数据库的电子邮件,但是,有一些带有错误字符的电子邮件。

在 DB 中,这些“坏撇号”显示为’,但在utf8_encode它们出现之后为�??。我尝试了各种编码来根据需要进行猜测和更改,但是,这往往会损害绝大多数其他电子邮件。

任何建议,在管道的一端或另一端,我如何让这几封电子邮件与其他所有内容相匹配,或者我如何至少preg_replace在最后创建一个可能的过滤器或其他什么?

更新

似乎即使是带有错误字符的电子邮件也会utf-8按照mb_detect_encoding. 这是在任何额外编码之前。iconv确实检测到有问题的问题,但这确实让我无法解决它们,只是在屏幕上放置一个 php 错误框,而不是FALSE它说它应该给出的简单返回,所以这似乎也不是解决方案.

4

2 回答 2

2

问题是您不知道邮件的编码。utf8_encode仅从 ISO-8859-1 编码到 UTF-8。因此,您可以尝试使用mb_detect_encoding获取编码,然后使用iconv转换为 UTF-8 。

编辑:您也可以尝试阅读Content-Type邮件的 's 字符集。

于 2013-07-24T13:24:16.847 回答
0

找到我的答案!

首先让我感谢Sebastián Grignoli创建这个非常方便的类原始)。我最终将它纳入我的最终解决方案。

其次,我将类添加到Codeigniter。对于任何使用 CI 的人来说,这是一个简单的实现。application/libraries只需在命名中创建一个文件Encoding.php(是的,大写e)。然后将代码复制到该文件,但在第 40 行注释掉(或删除)namespace ForceUTF8

我的最终结果看起来像:

echo(Encoding::fixUTF8(utf8_decode($msgHTML)));

我仍在仔细检查,但到目前为止,我还没有发现一个错误!

如果我在此之后发现另一个编码问题,我会确保更新。

SO Question I found that helped.

于 2013-07-24T15:15:02.957 回答