【发布时间】:2010-11-21 01:37:15
【问题描述】:
基本上我有一个数据库,我可以从中获取$lastname、$firstname、$rid、$since、$times 和$ip。
使用 Perl 脚本,我格式化数据以通过电子邮件发送。由于$lastname 和$firstname 可以包含特殊字符(例如ä、ü、ß、é、...),我首先对字符串进行解码。
my $fullname = decode("utf8", $lastname) . ', ' . decode("utf8", $firstname);
my $send = swrite(<<'END', $ip, $fullname, $rid, $since, $times);
@<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<< @<<<<<<<<<<<<<< @>>END
没有decode,特殊字符是垃圾(ä变成À),其余的都可以。
使用decode,一切都很好,除了名称包含特殊字符的行有几个< 太多。
这是为什么呢?以及如何删除它们?
编辑:swrite 来自perldoc perlform
sub swrite {
my $format = shift;
$^A = '';
formline($format, @_);
return $^A;
}
编辑2: 问题不在于终端,也不在于 STDOUT。我用:
use Mail::Sender;
use vars qw($sender);
#...
$sender->MailMsg({to => $mailto,
cc=> "",
bcc => "",
subject => "subject",
msg => $send});
而且收到邮件时字符显示不好。
编辑 3:
我得到的数据已经被打乱了。我得到 'À' 而不是 'ä',这就是我的格式失败的原因,因为使用解码时字符数会减少。
【问题讨论】:
-
Perl 不提供
swrite函数。您使用的是来自perldoc perlform的那个还是别的什么?如果没有这些信息,任何帮助都只是猜测。 -
对不起,我忘记添加 swrite 的代码了。
-
您使用的是什么终端/操作系统?这可能会影响事情。
-
您的问题似乎是电子邮件客户端无法处理 UTF-8 纯文本。您可能需要将电子邮件消息写入 MIME Multipart 并将文本类型指定为 UTF-8。
-
@Paul:我使用在 Debian "Lenny" 上运行的 xen 虚拟机 (2.6.18-6-xen-amd64)。数据库是 PostgresSQL 7.4 版