使用Zend / Mail /在Ibmi上将Char转换为= A3

时间:2013-09-25 10:28:21

标签: php email zend-framework zend-server

现在有两天时间处理一个从电子邮件正文内容中获取数据代码的项目。

我发现了一个关于get chars的问题!“$%& /()=?^。

通过编码为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编码的邮件来获得相同的结果。

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

有什么想法?有什么想法解决它?

任何建议都将不胜感激,

最好的问候

1 个答案:

答案 0 :(得分:0)

ISO-8859-1的第一个似乎是not to support Euro sign。 现在Windows-1252确实支持它,但是存在很大的误解和标准混淆。

  

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

     

历史背景:Microsoft基于ANSI标准草案的设计设计。一个glossary by Microsoft explicitly admits this

现在,某些操作系统可能无法在ISO-8859-1& Windows-1252,其他人默默地知道这些差异,并且不会在这里失败。

  • 在您的示例中,代码转换为Windows-1252(应根据操作系统加以补充):

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

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

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

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

文本应为Windows-1252编码。 在特殊符号的HTML中使用他们的HTML Entities。使用htmlspecialchars()UTF-8Windows-1252

这些字符编码标准实在是太乱了,每个人都需要就一个共同的标准达成一致来统治它们。 :) 更多信息herehere。 一篇关于Character Encoding (Unicode and Char. Sets) can be found here的好文章。