6

perl でメールの件名をエンコードする方法は?

今、私は最終的に何かを見つけましたが、まだ機能していません:

use MIME::Words qw/encode_mimewords/;
$recipientsubject = encode_mimewords('Votre fichier a bien été envoyé');

しかし、(バグのある)結果は次のとおりです。

件名: Votre fichier a bien =?ISO-8859-1?Q?=E9t=E9?= =?ISO-8859-1?Q?envoy=E9?=

どちらが表示されますか:

Votre fichier a bien étéenvoyé

(それはいくつかのスペースを食べます)

4

2 に答える 2

17

Encodeを使用してください。これはコアモジュールです。

perl -Mutf8 -MEncode -E 'say encode("MIME-Header", "Votre fichier a bien été envoyé")'

… 次のいずれかを出力します。

=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?=
=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?=

そして次のようにデコードします:

perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?=")'
perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?=")'

どちらが印刷されますか:

Votre fichier a bien été envoyé

それでも同じ結果が得られる場合は、Perl 環境に関する詳細情報を提供する必要があります。バージョンは良いスターターです。

于 2012-08-15T13:45:51.963 に答える
2

非 ASCII 文字列の MIME エンコードを処理する別のモジュールはEmail::MIME::RFC2047です。例えば

use strict;
use warnings;
use utf8;

use Email::MIME::RFC2047::Encoder;
use Email::MIME::RFC2047::Decoder;

binmode(STDOUT, ':utf8');

my $encoder = Email::MIME::RFC2047::Encoder->new;
my $encoded = $encoder->encode_text('Votre fichier a bien été envoyé');
print "$encoded\n";

my $decoder = Email::MIME::RFC2047::Decoder->new;
my $decoded = $decoder->decode_text($encoded);
print "$decoded\n";

版画

Votre fichier a bien =?utf-8?Q?=c3=a9t=c3=a9_envoy=c3=a9?=
Votre fichier a bien été envoyé

エンコードよりも Email::MIME::RFC2047 のいくつかの利点:

  • フレーズ内で引用符付き文字列を使用することによって、できるだけ少ない単語に対して MIME エンコーディングを使用しようとします。
  • To、From、または Cc ヘッダーで使用される MIME フレーズの正しいデコードをサポートします (Encode では不可能)。
  • UTF-8 以外の文字セットをサポートしています。
  • MIME-Q でエンコードされた単語のアンダースコアとしてスペースをエンコードします。
  • Encode よりもバグが少ないです (私が知っているものはありません)。

開示:私はモジュールの作成者です。

于 2015-06-29T23:30:38.473 に答える