【问题标题】:Perl | IMAP folder encoding. UTF8 -> UTF7 -> UTF8 = fail珀尔 | IMAP 文件夹编码。 UTF8 -> UTF7 -> UTF8 = 失败
【发布时间】:2015-05-15 12:54:59
【问题描述】:

我需要有关 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";

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

[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-'
ÐÑовеÑка

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

出了什么问题?

【问题讨论】:

    标签: perl utf-8


    【解决方案1】:

    您已被many gotchas of Unicode in Perl 之一抓住。 use utf8 only 开启 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 现在返回 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";
    

    【讨论】:

      【解决方案2】:

      如果您没有安装 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"
      Проверка
      

      【讨论】:

        猜你喜欢
        • 2016-01-20
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多