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?我期待Проверка
什么地方出了错?
您已经被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)
| 归档时间: |
|
| 查看次数: |
760 次 |
| 最近记录: |