我有一个.mbox邮箱文件,其中包含数千封不同语言的电子邮件,分别用ascii、iso-8859-1和utf-8编码。我想把文件“展平”成utf-8。
我的第一个工作是遍历文件,对每个字符执行file -b --mime-encoding操作,对任何被检测为iso-8859-1的字符执行iconv -f ISO-8859-1 -t UTF-8操作。我知道utf-8是ascii的超集,所以只有i so-8859-1需要转换。
这花了很长时间,但由于某些原因并没有像预期的那样奏效。问题人物依然存在。
在一行程序中是否有一种明显的方法可以做到这一点,或者是否有必要使用formail逐个消息转换文件消息?

最佳答案

据我所知,mime邮件及其容器.mbox文件总是以ascii格式编码,非ascii源字符以qp格式显示。
例如,在我的所有.mbox文件中,“e”由“=e9”表示(不管消息的原始编码是什么)
参见this wikipedia entry on quoted-printable编码
这意味着,您将遇到的任何原始非ascii字符都不会在iso-8859-1或其他版本中,而是已经转换为符合以下正则表达式的字符:=[0-9A-F]{2}
您可以用这种方式简单地使用sedecho -e转换qp编码

sed -re 's/=([0-9A-F]{2})/\\\\u00\1/g' | while read L ; do echo -e $L ; done

说明:
sed将把所有qp形式的两个十六进制数字(如“=e9”)替换为unicode代码点(如“\u00e9”)。
echo-e可以将后者转换为字符形式(自bash 4.2以来)

10-07 19:43
查看更多