MIME decodeでBOMって無条件に削除してしまってよいのですっけ。 まぁ現実的にはほぼ全てのケースで消してよいとは思うのですが。
入力に BOM が付いていることと、出力に BOM をつけるべきかどうかは全く独立の話でしょう。持ち回っていること自体太い間違いだと思います。
まず出力側で言うと、nkfはストリーム中のU+FEFFは"ZERO WIDTH NO-BREAK SPACE"という文字だとして扱っています。 文字扱いなので、出力時にBOM付きを指定した場合、何も考えずにさらにBOMをつけ加えるのは意図した挙動です。
問題は入力で、通常ルートでの入力ではnkfは自動でBOMを認識して削除します。
一方、エンコーディングが外部から与えられる仕組みである、MIME下でBOMとみなすべきなのかがよくわかりません。 基本的にはそのようなケースでは内容に対してはフィルタは中立であった方がよいという考えでいますが、 現実のBOM付きのUTF-8をMIMEで出力するメールアプリケーションなりが存在するならば考慮します。
間違いだと思います。Unicode 仕様 (例えば Unicode 10.0 p.866) には
Systems that use the byte order mark must recognize when an initial U+FEFF signals the byte order.
となっているので、ZERO WIDTH NO-BREAK SPACE と解釈する上に BOM をつけるという解釈はあり得ないです。
その記述でいえば、nkf -w8 -mの入力側、つまりMIME encoded wordのdecoderは "Systems that use the byte order mark"ではないと考えています。 大きくいえば、前の段落でいう"Where the byte order is explicitly specified"の場合を慣用出来る状態ですね。
一方で出力側はそうしたSystemsなので同段落の後半に記述される "To represent an initial U+FEFF zero width no-break space in a UTF-16 file, use U+FEFF twice in a row. The first one is a byte order mark; the second one is the initial zero width no-break space. See Table 23-6 for a summary of encoding scheme signatures." と類似した状況だと考えます。
でも、現に nkf の MIME encoder 側の出力は U+FEFF を BOM としてつけているわけで、首尾一貫していないし、仕様違反だと思います。また、MIME の時だけ BOM を用いないシステムに化けるのはどう考えてもおかしい。 MIME以外でも一貫して UTF-8 BOM をつけない、入力側は ZWNBSP として扱うなら仕様違反ではないですが。
また、そもそも現在の仕様では ZWNBSP は使うべきではない (should not) なので、ZWNBSP に配慮する必要はあまり感じられない。
もうひとつ、
「一方で出力側はそうしたSystemsなので同段落の後半に記述される "To represent an initial U+FEFF zero width no-break space in a UTF-16 file, use U+FEFF twice in a row. The first one is a byte order mark; the second one is the initial zero width no-break space. See Table 23-6 for a summary of encoding scheme signatures." と類似した状況だと考えます。」
現時点で、UTF-8 MIME で U+FEFF, U+FEFF というシーケンスがあったら ZWNBSP 二個と解釈されるので、"To represent an initial U+FEFF zero width no-break space in a UTF-16 file, use U+FEFF twice in a row. The first one is a byte order mark" にはなりません。全然類似した状況ではないと思います。
でも、現に nkf の MIME encoder 側の出力は U+FEFF を BOM としてつけているわけで、首尾一貫していないし、仕様違反だと思います。また、MIME の時だけ BOM を用いないシステムに化けるのはどう考えてもおかしい。 MIME以外でも一貫して UTF-8 BOM をつけない、入力側は ZWNBSP として扱うなら仕様違反ではないですが。
-w8 ではなく -w を使えばそうなりますね。 言い換えれば、明示的にBOMをつけているとみなしているので、なぜMIMEでBOMをつけたいのかよくわかりませんが、指定通りにつけています。
題記の通りです。MIME で UTF-8 エンコーディング、BOMありでエンコードしたものを nkf で UTF-8 エンコーディング、BOMありでデコードすると、BOMが2個ついてしまいます。