1

我的一个邮件发送对象的一小部分创建了确认电子邮件的 HTML 版本......它都是 utf-8 编码并且非常高兴,直到我遇到表示捐赠给 RSPCA 的字符串 - 例如Donation (RSPCA): £1.30

检索慈善信息都是由数据库驱动的,但我将其分解为简单的字符串以尝试查看发生了什么,因此插入代码如下所示:

$sDonationLabel = preg_replace('/^(\w[^:]+)(\:?)$/u', "$1 ({{THIS_IS_THE_ODDBALL}})$2", $this->_dictionary->read('label_donation_total'));

$sContentInner .= "<tr>\n"
        . "<th colspan=\"3\" align=\"right\"><font face=\"verdana, arial, helvetica, sans-serif\" size=\"2\" color=\"#404040\">"
        . $sDonationLabel
        . "</font></th>\n"
        . "<td align=\"center\"><font face=\"verdana, arial, helvetica, sans-serif\" size=\"2\" color=\"#000000\">"
        . $this->_order->getCurrency()->format($this->_order->getDonationValue(), $this->_order->getLocale())
        . "</font></td>\n"
        . "</tr>\n";

用各种字符串替换它{{THIS_IS_THE_ODDBALL}}会在相应的电子邮件中得到以下结果:

RS

RS

退休储蓄计划

退休储蓄计划

RSPC

RSPC

RSPCA

在此处输入图像描述

RSPCAB

在此处输入图像描述

如您所见,当我得到字符串“捐赠(RSPCA):”时,它似乎将字符集从 utf-8 扔到 latin-8859-1 中,从而用 2 个“未知字符”符号替换了£符号(我我猜这是一个从 utf-8 到 8859-1 的字符集,因为 utf-8 每个字符的位数是原来的两倍,这会导致出现双重“未知”字符)。但它似乎在输出Total: £33.00表行的下一个文本插入块恢复为 utf-8 。

为了确保它没有在正则表达式中发生,我还将变量定义$sDonationLabel为字符串文字,如下所示:

$sDonationLabel = 'Donation (RSPCA):';

这仍然会导致损坏的 £ 符号。

我知道我可以用 £ 符号替换,&pound;但我想知道为什么那个特定的字符串会导致这个奇怪的问题 - 有没有我遗漏的东西,字符集意味着类似的东西(RSPCA):具有某种特殊含义,导致字符集改变……什么?

4

0 回答 0