我的一个邮件发送对象的一小部分创建了确认电子邮件的 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
退休储蓄计划
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):';
这仍然会导致损坏的 £ 符号。
我知道我可以用 £ 符号替换,£
但我想知道为什么那个特定的字符串会导致这个奇怪的问题 - 有没有我遗漏的东西,字符集意味着类似的东西(RSPCA):
具有某种特殊含义,导致字符集改变……什么?