佩尔 | IMAP 文件夹编码。 UTF8 -> UTF7 -> UTF8 = 失败
Perl | IMAP folder encoding. UTF8 -> UTF7 -> UTF8 = fail
我需要有关 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-'
ÐÑовеÑка
卧槽?我预计 Проверка
出了什么问题?
你被 many gotchas of Unicode in Perl 中的一个抓住了。 use utf8
仅 开启UTF-8语法。这意味着诸如 constant 字符串、变量名和函数名之类的东西将采用 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.
导入了字符名,因此 \N{...} 序列可用于根据名称编译 Unicode 字符。
readdir 现在 returns UTF-8 字符而不是字节。
glob 和 <> 运算符现在 return 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";
如果您没有安装 utf8::all
并且只想要一个快速的单行代码,您也可以使用 Perl's -C
option 使其在 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"
Проверка
我需要有关 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-'
ÐÑовеÑка
卧槽?我预计 Проверка
出了什么问题?
你被 many gotchas of Unicode in Perl 中的一个抓住了。 use utf8
仅 开启UTF-8语法。这意味着诸如 constant 字符串、变量名和函数名之类的东西将采用 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.
导入了字符名,因此 \N{...} 序列可用于根据名称编译 Unicode 字符。
readdir 现在 returns UTF-8 字符而不是字节。
glob 和 <> 运算符现在 return 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";
如果您没有安装 utf8::all
并且只想要一个快速的单行代码,您也可以使用 Perl's -C
option 使其在 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"
Проверка