2014-07-07 111 views
0

我需要驗證具有在從一些電子郵件地址是合法的麻煩:現場Unicode字符,如:電子郵件::使用UTF8

From: =?iso-8859-1?Q?Jos=E9_name?= <[email protected]> 

該值被保存在由變量$。

有了這個代碼

my $validator = Email::Valid->new(); 
my $addr = $validator->address($from); 
print $addr, "\n"; 

我正在初始化值$地址的使用在

相同的代碼工作正常與不包含Unicode字符值。我試過使用binmode(STDIN,':utf8');但這並不能解決問題。

感謝您的幫助!

+1

http://www.perlmonks.org/?node_id=1092570 – toolic

+3

'來自:????= ISO-8859-1 Q喬斯= E9_name = <[email protected]>不是電子郵件地址。這是一個MIME頭。 MIME標頭的值是'Joséname <[email protected]>' – ikegami

回答

0

正如在回答通過toolic在評論中提到的cross post

的問題是,從地址是電子郵件標頭的一部分。在標題中只有ASCII是有效的。這就是爲什麼只有ASCII編碼的字符串纔有效的原因。因此,包含非ASCII字符é的字編碼爲=?iso-8859-1?Q?Jos=E9_Name?=

當你將這個字節字符串帶入驗證程序時,一切都很好。所以,恕我直言,解決方案必須是你編碼表示電子郵件地址的unicode字符串在一個有效的ascii表示。

#!/bin/perl 
    use strict; 
    use warnings; 
    use 5.010; 

    use Email::Valid; 
    use Data::Dumper; 
    use Encode qw(encode decode); 

    my $utf8_from = decode('UTF-8', 'José <[email protected]>'); 
    my $from = encode('MIME-Header', $utf8_from); 
    say "Mail: $from"; 
    my $validator = Email::Valid->new(); 
    if(my $addr = $validator->address($from)) { 
     say "OK: ", Dumper($addr); 
    } 
    else { 
     say "Not valid"; 
    } 

輸出:

Mail: =?UTF-8?B?Sm9zw6kg?=<[email protected]> 
    OK: $VAR1 = '[email protected]'; 
相關問題