我编写了几个PHP脚本来读取数据库的内容并在电子邮件中输出这些内容。每隔一段时间,我会在输出中看到一个SPACE(0x20)字符,其中不应该有任何字符。例如,在一个脚本中,我引用一个包含完全“n”非空格字符的PHP全局变量,有时(并非总是),当该变量被转储到电子邮件消息时,该字符串将显示一个嵌入的空白(制作字符串“n + 1”的总长度。其他时候,HTML标记(例如< BR>)将显示为< BR> (注意“B”之前的空格。)
由于脚本的行为不一致(某些电子邮件受到影响,而其他电子邮件没有受到影响),我似乎无法找到问题。
我附上一个PHP脚本的链接,偶尔会在BREAK标记中嵌入一个空格。我删除了为数据库提供特定登录信息的行。否则,其他一切都完好无损。在下面的链接中可以找到的代码文件中,第281行是包含带有嵌入式SPACE的BREAK命令的代码文件(如上所述)。这只发生过一次!
http://jem-software.com/temptest.txt
我想唯一其他可能相关的信息是这个脚本文件来自输入Joomla中包含的JUMI代码块的代码!基于网站。
编辑1:
谢谢你,里卡多,你的建议。以下是一些澄清:
我没有阅读电子邮件并解析结果以便插入数据库。恰恰相反,我正在从数据库中读取并使用结果创建电子邮件。我将检查数据库以查看使用了哪个字符集,并显式传递字符集以查看是否有所不同。
我不使用Joomla函数来访问数据库,因为我引用的数据库是Joomla的外部数据库!环境。它是一个预先存在的数据库,是根据几年前编写的PHP脚本创建的。当我的旧网站使用Joomla重新编写时,我想完整地“移植”PHP数据库访问代码,因此我安装了JUMI插件以实现此目的。
我将查看数据库中的字符编码,并将其与电子邮件的字符代码同步。
我不明白字符编码的问题如何导致将SPACE插入到硬编码的HTML标记中 - 这个标记不是来自任何数据库,而是作为一个数据库输入到电子邮件中文字字符串。
答案 0 :(得分:0)
这是一个奇怪的问题,但这是我的两分钱:
首先,您没有使用Joomla函数来访问数据库和邮件子系统。虽然这可行,但它并不是很好。
第二,这就像字符集/代码页问题。
以下是关于字符集问题的一些注意事项:
我快速阅读你的代码,我没有发现任何错误。但是Joomla使用UTF-8,你的查询没有指定它(mysql_set_charset()丢失!)这可能是第一个问题。
第二种情况是,您阅读的电子邮件将具有不同的字符集,具体取决于发件人的设置。确保正确处理代码页问题:以下是我用于解析电子邮件的函数的片段:
$mime = imap_fetchmime($this->connection, $this->messageNumber, $partNumber);
return $this->decodeMailBody($data,$mime); // QUOTED_PRINTABLE
function decodeMailBody($string,$mime) {
$str = quoted_printable_decode($string);
echo "<h3>mime: $mime; charset $charset</h3>";
//mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8
//mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252
$mimes = explode('charset=',$mime);
foreach($mimes as $mimepiece) {
$charset = $mimepiece;
}
$charset = strtolower(trim($charset));
if ($charset == 'utf-8') {
return $str;
} else {
return iconv($charset, 'UTF-8', $str);
}
}
最后,确保在解析后将邮件插入数据库时使用utf-8。