为了在 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 ...
iconv
(或者至少 Debian 12 上可用的 2.36 版本)知道您需要的编码:所以:
请注意,两个输出都缺少换行符(因此回显将其添加在结果的末尾以提高可读性),但换行符已编码,因此在字符串末尾添加或不添加 LF 是两个不同的结果。
在使用
iconv
(或recode
以及uconv
其他专用于字符集转换的工具)时,假设它们支持 IMAP-UTF-7 将是这里的最佳方法,为了让您的perl
命令处理输入而不是参数,您可以这样做:-p
用于sed
模式,其中perl
读取其输入(或作为参数给出的文件)并像那样在每一行上运行代码sed
。$_
与 的模式空间等效,sed
只不过与perl
相反sed
,它确实包含行分隔符。使用
-CIi
,我们告诉perl
stdin 和其他输入(例如来自参数中的文件的输入)预计将以 UTF-8 编码的文本,因此它将在输入时自动解码。或命令输出以及更多内容,例如在基于 Linux 的机器上
perl -pe '$_ = uc $_' 'uname|'
输出。LINUX
它使用幕后<>
描述的钻石运算符。perldoc perlop