字符£转换为=A3在Ibmi上使用Zend/Mail/


Char £ conversion to =A3 using Zend/Mail/ on Ibmi

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

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

通过编码为 UTF-8 解决了所有这些问题,但 £ char 仍然保留在邮件内容上,例如"=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 看看它的作用(。

对此,你怎么看?有什么想法可以解决吗?

任何建议将不胜感激,

此致敬意

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

所谓的Windows字符

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

历史背景:Microsoft根据ANSI标准的草案设计了该套装。Microsoft的词汇表明确承认了这一点。

现在有些操作系统在ISO-8859-1Windows-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 和字符集(的好文章可以在这里找到。