现在两天来处理一个项目,从电子邮件正文内容中获取数据代码。
我发现了一个关于获取字符的问题,比如!$%&/((=?^.
通过编码为 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-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-8
或Windows-1252
。
这些字符编码标准都是一团糟,每个人都需要就一个共同的标准达成一致来统治它们。 :)更多信息在这里和这里。关于字符编码(Unicode 和字符集(的好文章可以在这里找到。