我需要创建一个管道将字符串从 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-

请注意,两个输出都缺少换行符(因此回显将其添加在结果末尾以提高可读性),但是换行符曾是编码,因此在字符串末尾添加或不添加 LF 会产生两个不同的结果。

答案2

尽管使用iconv(或者recodeuconv以及其他专用于字符集转换的工具),假设它们支持 IMAP-UTF-7 将是这里的最佳方法,为了让您的perl命令处理输入而不是参数,您可以这样做:

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

-p用于sed模式,其中perl读取其输入(或作为参数给出的文件)并像sed那样在每一行上运行代码。与 的模式空间$_等效sed,只不过与perl相反sed,它确实包含行分隔符。

使用-CIi,我们告诉perlstdin 和其他输入(例如来自参数中的文件的输入)预计将以 UTF-8 编码的文本,因此它将在输入时自动解码。


或命令输出以及更多内容,例如在基于 Linux 的机器上perl -pe '$_ = uc $_' 'uname|'输出。LINUX它使用幕后<>描述的钻石运算符。perldoc perlop

相关内容