文字列をUTF-8からUTF-7-IMAPに変換するには、パイプを作成する必要があります。

文字列をUTF-8からUTF-7-IMAPに変換するには、パイプを作成する必要があります。

IMAPメールディレクトリのコマンドラインから何百ものディレクトリを自動的に生成するには、すぐにUTF-8文字列をUTF-7-IMAPに変換できる必要があります。

PHPでは、文字列をパラメータとして渡してこれを行う方法を見つけましたが、それほど実用的ではなく、PHPをインストールする必要があります。

<?php
echo mb_convert_encoding($argv[1], "UTF7-IMAP", "UTF8");
?>

IconvはUTF-7-IMAPについて知らないようです。

反対のタスクを実行できる構文が見つかりました。

echo "Sant&AOk-" | tr "&" "+" | iconv -f UTF-7 -t UTF-8
Santé

ただし、これは元に戻すことはできません(最後の「-」がありません)。

echo "Santé" | iconv -f UTF-8 -t UTF-7 | tr '+' '&'
Sant&AOk

インターネット上でこれに関する情報がほとんど見つかりません。

編集する:

私はこれがうまく動作することがわかりました。

perl -CSA -MEncode::IMAPUTF7 -le 'print Encode::IMAPUTF7::encode("IMAP-UTF-7", shift)' "Santé"

しかし、パイプラインを作成する方法は?

echo "Santé" | perl ...

答え1

iconv(またはDebian 12で利用可能な少なくとも2.36バージョン)どのエンコードが必要かを学びます。

$ iconv -l | grep -i imap
UTF-7-IMAP//

だから:

$ printf '%s\n' 'Santé' | iconv -f UTF-8 -t UTF-7-IMAP; echo ''
Sant&AOkACg-
$ printf '%s' 'Santé' | iconv -f UTF-8 -t UTF-7-IMAP; echo ''
Sant&AOk-

どちらの出力も改行文字が欠落しているため、echoは読みやすくするために結果の末尾にそれを追加しますが、改行文字は以前はエンコードするので、文字列の最後にLFを追加または追加しないと、2つの異なる結果が生成されます。

答え2

しかし、使用iconv(またはrecode文字セット変換専用のその他のツール)IMAP-UTF-7をサポートしていると仮定すると、コマンドが引数の代わりに入力を処理できるようにするには、uconv次のようにします。perl

$ echo Santé | perl -CIi  -MEncode::IMAPUTF7 -pe '$_ = Encode::IMAPUTF7::encode("IMAP-UTF-7", $_)'
Sant&AOkACg-

-p入力(または引数として提供されたファイル)を読み取り、このように各行でコードが実行されるsedパターンに使用されます。とは異なり、行区切り文字が含まれている点を除いて、同じパターン空間です。perlsed$_sedperlsed

を使用すると、stdinなどの入力(引数内のファイルの入力など)にUTF-8でエンコードされたテキストを期待するように指示するため、入力-CIiperlに自動的にデコードされます。


またはLinuxベースのシステムなどのコマンド出力などperl -pe '$_ = uc $_' 'uname|'。後述のダイヤモンド演算子をLINUX使用してください。<>perldoc perlop

関連情報