Perl | IMAP文件夹编码。UTF8 -> UTF7 -> UTF8 = 失败

3

我需要关于imap文件夹编码的建议。

我的邮件客户端(Thunderbird)使用俄语符号创建了一个imap文件夹。

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

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

我编写了以下代码进行转换(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";

尝试将文件夹名称转换为俄语。
[w@pandora6 tmp]$ ./imapfolder.pl from '&BB8EQAQ+BDIENQRABDoEMA-'
Проверка

一切正常

尝试反向转换

[w@pandora6 tmp]$ ./imapfolder.pl to Проверка
&ANAAnwDRAIAA0AC+ANAAsgDQALUA0QCAANAAugDQALA-

嗯..我期望的是&BB8EQAQ+BDIENQRABDoEMA-

好的,进行编码回传

[w@pandora6 tmp]$ ./imapfolder.pl from '&ANAAnwDRAIAA0AC+ANAAsgDQALUA0QCAANAAugDQALA-'
ÐÑовеÑка

什么鬼?我期望看到Проверка

出了什么问题?

2个回答

8
您已经被 Perl 中 Unicode 的 许多陷阱 之一所困扰。 use utf8 仅启用了 UTF-8 语法。这意味着像常量字符串、变量名和函数名这样的东西将会是 UTF-8 编码的。其他所有内容都不是。特别地,@ARGV 中的字符串不会是 UTF-8 编码的。它们仍然是普通的字节。
幸运的是,有一个简单的解决方法。使用 utf8::all。这将打开您期望 use utf8 打开的所有 UTF-8 功能。
  • 使 @ARGV 编码为 UTF-8(当从主包使用 utf8::all 时)。

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

  • charnames 被导入,因此可以使用 \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";

0
如果您没有安装utf8::all,并且只想使用一个快速的一行代码,您也可以使用Perl的-C选项,使其在UTF8中执行所有操作。
示例:
$ utf7=$(perl -CSA -MEncode::IMAPUTF7 -le 'print Encode::IMAPUTF7::encode("IMAP-UTF-7", shift)' "Проверка")
$ echo "$utf7"
&BB8EQAQ+BDIENQRABDoEMA-

$ perl -CSA -MEncode::IMAPUTF7 -le 'print Encode::IMAPUTF7::decode("IMAP-UTF-7", shift)' "$utf7"
Проверка

请问如何使用这个命令创建一个管道?perl -CSA -MEncode::IMAPUTF7 -le 'print Encode::IMAPUTF7::encode("IMAP-UTF-7", shift)' "Проверка" echo "string" | perl... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接