1

它现在有两天时间致力于从电子邮件正文内容中获取数据代码的项目。

我发现了一个关于获取字符的问题,例如 !"$%&/()=?^.

通过编码为 UTF-8 解决了所有问题,但 £ 字符仍保留在邮件内容中,如“=A3”。

这里的示例代码最多可以理解我所说的场景:

$mail = new Zend\Mail\Storage\Imap ( array (
            'host' => 'imap.xxxxxxxx',  //is gmail if it can be useful
            'user' => 'xxxxx@xxxxxxxxx',
            'password' => 'xxxxxxxxxx',
            'port' => '993',
            'ssl' => 'SSL' 
      ) );

$folder = $mail->getFolders ()->INBOX;
foreach ( $mail as $emailMsg ) {
$bodymsg = $emailMsg->getContent ();
$pos = strpos ( $bodymsg, '*DATA CODE*' );
$datacode= substr ( $bodymsg, $pos + 11, 10 );
$datacode= mb_convert_encoding ($datacode,'ISO-8859-1','UTF-8');
echo $datacode; //example of  datacode £GS&9KBS8  but i get =A3GS&9KBS8

我找到了一个解决方案

$datacode= str_replace ( '=A3', '£', $datacode);

接着

$datacode= mb_convert_encoding ($datacode,'ISO-8859-1','UTF-8');

但我认为这不是一个好主意。

通过读取以 UTF-8 、 ISO-8859-** 和 windows-1252 编码的邮件,结果相同。

由 IBMi 上的 CLP 程序运行的 PHP 脚本,它通过 QP2TERM 或 QP2SHELL 调用它(我现在使用 QP2TERM 来查看它的作用)。

对此有何看法?有什么办法解决吗?

任何意见,将不胜感激,

此致

4

1 回答 1

0

首先ISO-8859-1似乎不支持欧元符号。现在Windows-1252确实支持它,但是存在很大的误解和标准混淆。

所谓的 Windows 字符集(准确地说是 WinLatin1,或 Windows 代码页 1252)使用其中一些位置来存储可打印字符。因此,Windows 字符集与 ISO 8859-1 不同。Windows 字符集通常称为“ANSI 字符集”,但这是严重误导。它尚未获得 ANSI 的批准。

历史背景:微软基于 ANSI 标准的草案设计了该系列。Microsoft的词汇表明确承认了这一点

ISO-8859-1现在有些操作系统可能不会在&之间产生很大的不同Windows-1252,而其他操作系统则默默地知道这些差异并且不会在这里失败。

  • 如您的示例代码转换为Windows-1252(应根据操作系统支持):

$datacode= mb_convert_encoding ($datacode,'Windows-1252','UTF-8');

如果您正在运行 Linux,现在检查字符串的编码,您将看到操作系统(和 PHP 或课程)已将其转换为ISO-8859-1. 但这不是问题。

  • 将正确的字符集标头发送到:'Content-Type: text/csv;charset=windows-1252'。Zend Mailer 应该有一个设置标题的接口。检查文档。

以 HTML 和文本格式发送电子邮件。

文本应该被Windows-1252编码。在特殊符号的 HTML 中使用它们的HTML 实体。使用htmlspecialchars()UTF-8Windows-1252

这些字符编码标准完全是一团糟,每个人都需要就一个通用标准达成一致来统治它们。:) 更多信息在这里这里可以在这里找到一篇关于字符编码(Unicode 和字符集)的好文章。

于 2013-09-26T09:54:33.040 回答