PERL | IMAP文件夹编码.UTF8 - > UTF7 - > UTF8 =失败

Ant*_*sov 2 perl encoding utf-8

我需要有关imap文件夹编码的建议.

我是由我的邮件客户端(Thunderbird)imap文件夹与俄罗斯符号创建的.

文件夹名称是 - Проверка

文件系统上的文件夹名称是 - user.mylogin.&BB8EQAQ + BDIENQRABDoEMA-

我为convert编写了这段代码(perl v5.10.1)

use strict;
use warnings;
use utf8;
use Encode::IMAPUTF7;

my $folder=$ARGV[1];

binmode(STDOUT,':utf8');

if ($ARGV[0] eq 'to')
    { print Encode::IMAPUTF7::encode('IMAP-UTF-7', $folder) }
    elsif ($ARGV[0] eq 'from')
    { print Encode::IMAPUTF7::decode('IMAP-UTF-7', $folder) }
print "\n";
Run Code Online (Sandbox Code Playgroud)

尝试将文件夹名称转换为俄语

[w@pandora6 tmp]$ ./imapfolder.pl from '&BB8EQAQ+BDIENQRABDoEMA-'
????????
Run Code Online (Sandbox Code Playgroud)

一切正常

尝试反向转换

[w@pandora6 tmp]$ ./imapfolder.pl to ????????
&ANAAnwDRAIAA0AC+ANAAsgDQALUA0QCAANAAugDQALA-
Run Code Online (Sandbox Code Playgroud)

嗯......我期待&BB8EQAQ + BDIENQRABDoEMA-

好的,编码回来

[w@pandora6 tmp]$ ./imapfolder.pl from '&ANAAnwDRAIAA0AC+ANAAsgDQALUA0QCAANAAugDQALA-'
ÐÑовеÑка
Run Code Online (Sandbox Code Playgroud)

WTF?我期待Проверка

什么地方出了错?

Sch*_*ern 6

您已经被Perl中的许多Unicode问题之一所困. use utf8 打开UTF-8语法.这意味着像常量字符串,变量名和函数名这样的东西都是UTF-8.其他一切都不会.具体来说,字符串@ARGV不是UTF-8.那些仍然是普通的字节.

幸运的是,有一个简单的解决方案.使用utf8 :: all.这将打开您期望use utf8执行的所有UTF-8功能.

  • 使用UTF-8编码@ARGV(当从主包使用utf8 :: all时).

  • 文件句柄默认打开UTF-8编码(包括STDIN,STDOUT,STDERR).如果您不希望UTF-8用于特定的文件句柄,则必须设置binmode $ filehandle.

  • 导入的字符使得\ N {...}序列可用于根据名称编译Unicode字符.

  • readdir现在返回UTF-8字符而不是字节.

  • glob和<>运算符现在返回UTF-8字符而不是字节.

您的代码缩减为......

use strict;
use warnings;
use utf8::all;
use Encode::IMAPUTF7;

my $folder=$ARGV[1];

if ($ARGV[0] eq 'to') {
    print Encode::IMAPUTF7::encode('IMAP-UTF-7', $folder)
}
elsif ($ARGV[0] eq 'from') {
    print Encode::IMAPUTF7::decode('IMAP-UTF-7', $folder)
}
print "\n";
Run Code Online (Sandbox Code Playgroud)