php - 如何自动将电子邮件附件文件名转换为 UTF-8(使用 Mail_mimeDecode)

标签 php internationalization

我正在使用 Mail_mimeDecode从收到的电子邮件中提取附件。一段时间以来一切正常,直到我开始收到文件名编码为 KOI8 的附件。 ,带有这样的节标题:

Content-Disposition: attachment; filename="=?KOI8-R?B?8NLJzM/Wxc7JxSAudHh0?="

mimeDecode 做了一件非常合理的事情并返回 KOI8 中的文件名:

$attachmentNameInKOI8 = $part->d_parameters['filename'];

问题是我需要它在 UTF-8 中。在这个具体示例中,我可以运行以下命令来进行转换:

$attachmentNameInUTF8 = iconv('KOI8', 'UTF-8', $attachmentNameInKOI8);

但如果不尝试手动解析消息,我不知道该名称何时在 KOI8 中,何时不在。我还担心其他一些编码很快就会出现,所以我需要一种方法来处理可能遇到的任何问题。

我读过 mb_detect_encoding不可靠,事实上我无法将字符串检测为 KOI8。

有没有办法告诉 mimeDecode 为我做翻译?我查看了 mimeDecode.php:_decodeHeader() 的源代码我可以看到它解析了编码但随后什么也不做,这似乎是在浪费机会。

更新:明确地说,这只是 header 的问题,而不是正文的问题,因为 mimeDecode 公开了正文的字符集,因此您自己运行 iconv 非常容易,如下所示:

$bodyutf = iconv($textpart->ctype_parameters['charset'], 'UTF-8', $textpart->body);

最佳答案

在替换之前向 _decodeHeader() 添加一行似乎可以解决问题:

$text = iconv($charset, 'UTF-8', $text);
$input = str_replace($encoded, $text, $input);

他们没有在原始类中构建这样的选项似乎很奇怪,不是吗?

注意:我注意到主题行和其他 header 也可以像文件名一样编码 (RFC2047)。似乎将 iconv 行添加到 _decodeHeader 可以解决所有这些情况。

奇怪的是,mimeDecode 中还没有内置这样的功能——这不是一个罕见的问题。

编辑:我现在明白 mimeDecode 具有 decode_headers=false 选项的意义在于获取原始值,以便您可以自己解码它们。这似乎是一种浪费,因为如果您不相信它会返回预期字符集中的字符串,那么让 mimeDecode ever 解码您的 header 是没有意义的(它更有意义接受一个字符集作为要解码的参数;或者 null 表示不解码......我觉得他们不太可能为我改变它。)所以关键是你需要自己解码。不幸的是,它不像直接调用 imap_utf8() 或 imap_mime_header_decode() 那样简单。您可以从 mimeDecode 中获取 _decodeHeader() 函数并修改它,或者使用类似这样的方法:

http://www.php.net/manual/en/function.imap-mime-header-decode.php#71762

编辑 #2:令人难以置信的是,mimeDecode 人员已经将我的建议纳入了他们最新的 svn:

https://pear.php.net/bugs/bug.php?id=18876

在该版本上,您现在可以设置 decode_headers='UTF-8',mimeDecode 将为您完成所有工作。哇!

关于php - 如何自动将电子邮件附件文件名转换为 UTF-8(使用 Mail_mimeDecode),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7559111/

相关文章:

javascript - 使 div 居中,即使内容比屏幕宽

php - xdebug 和 CentOS 的问题

ios - 使用 iOS Stringsdict 文件的显式复数字符串

node.js - 如何将 i18n 模块与 hapi.js 一起使用?

java - 总重量。 UiBinder 中的国际化如何运作?

grails - 消息包中的字符串正在丢失 UTF-8 编码

php - Arduino 和网络服务器之间的连接监控

php - PHP解析/语法错误;以及如何解决它们

php - “DonutChart”不是有效的 Lavachart 对象

database - 使用从数据库加载的 ResourceBundle 条目在 JSF 中进行国际化