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
パターンに使用されます。とは異なり、行区切り文字が含まれている点を除いて、同じパターン空間です。perl
sed
$_
sed
perl
sed
を使用すると、stdinなどの入力(引数内のファイルの入力など)にUTF-8でエンコードされたテキストを期待するように指示するため、入力-CIi
時perl
に自動的にデコードされます。
またはLinuxベースのシステムなどのコマンド出力などperl -pe '$_ = uc $_' 'uname|'
。後述のダイヤモンド演算子をLINUX
使用してください。<>
perldoc perlop