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

标签 perl 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";

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

[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?我预计 Проверка

出了什么问题?

最佳答案

你被其中一个 many gotchas of Unicode in Perl 捕获了. use utf8 打开 UTF-8 语法。这意味着诸如常量 字符串、变量名和函数名之类的东西将采用 UTF-8。其他一切都不会。特别是 @ARGV 中的字符串将不是 UTF-8。这些仍然是纯字节。

幸运的是,有一个简单的修复方法。使用 utf8::all .这将启用您希望使用 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";

关于佩尔 | IMAP 文件夹编码。 UTF8 -> UTF7 -> UTF8 = 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29025508/

相关文章:

perl - Catalyst::Plugin::StatusMessage 跨多个 'app' 服务器

apache - 如何使用带有 Bitnami LAMP Stack 的 mozilla 执行脚本 Perl?

c - 跨平台 C 应用程序的 UTF8 支持

java - 在 Java/Android 中找出 UTF-8 字符串中的字符数

php - Debian Stable php-5.4 上的 Symfony2 JsonResponse utf8 编码问题

utf-8 - 请定义术语 "Multi-byte safe"

PHP:在不知道原始字符集的情况下将任何字符串转换为 UTF-8,或者至少尝试一下

perl - Perl 脚本的 IntelliJ 调试配置

perl - 如何在 Perl 中使用散列作为子例程的参数?

regex - 如何在数据的位置打印匹配的字符串?