iconv(3) では、inbufをNULLにすることで状態のフラッシュを行う機能があり、ストリームの終端ではこれが実行されることが期待されている。
https://manpages.debian.org/stretch/manpages-dev/iconv.3
> In each series of calls to iconv(), the last should be one with inbuf or *inbuf equal to NULL, in order to flush out any partially converted input.
しかし、 GHC.IO.Encoding http://hackage.haskell.org/package/base-4.11.1.0/docs/GHC-IO-Encoding.html にはこれに相当するAPIが存在しない。 結果として、例えば以下のようなコードを実行すると、末尾に出力されるべきエスケープシーケンスが出力されないままになってしまう……
enc <- mkTextEncoding "iso-2022-jp"
withFile "hoge.txt" WriteMode $ \h -> hSetEncoding h enc >> hPutStr h "こんにちは世界"
まあ、iso-2022-jpの末尾のエスケープシーケンスの欠落くらいだと大した問題ではないかもだけど、もっと本質的な情報が欠落してしまうようなケースって実際にはないのかな……?
#Haskell
enc <- mkTextEncoding "EUC-JISX0213"
withFile "hoge.txt" WriteMode $ \h
> hSetEncoding h enc >> hPutStr h "\x3051" -U+3051 = けというのも U+3051 「け」を見た段階では出力するバイト列を決定できず、ここで文字列が終了であれば バイト列 0xa4 0xb1 (面区点 1-4-17) を出力すべき一方、もし次にくるコードポイントが U+309a (Combining Katakana-Hiragana Semi-Voiced Sound Mark) であれば「け゚」となって、 バイト列 0xa4, 0xfa (面区点 1-4-90 HIRAGANA LETTER BIDAKUON NGE) を出力すべきであり、フラッシュしないとどちらを出力すべきか確定できないため。
https://ghc.haskell.org/trac/ghc/ticket/15553