Haskell で UTF-8 のファイル入力

本棚に「ふつうの Haskell」という本があったので Haskell を触ってみたのだけど。
2つめのサンプルプログラムの標準入力を読んで標準出力に出力するというやつがいきなり動かなくて困った。

サンプルだとアメリカの州の名前が入ったテキストファイルを表示してたので、日本の県名が入ったファイルを表示しようとしたところ、

 hGetContents: invalid argument (invalid byte sequence)

と怒られる。どうも UTF-8 だとだめらしい。

私の Haskell 体験は終わってしまった、でも良かったのだけど。まあ流石に早過ぎるかなと思っていろいろ調べた所、hSetEncoding というのでエンコーディングを直接指定するといいらしい。

import System.IO

main = 
  do hSetEncoding stdin utf8
     hSetEncoding stdout utf8
     cs <- getContents
     putStr cs

デフォルトは UTF-8 らしいけど、システムのデフォルトエンコーディングに影響されてうまく読めないとかなんとか。
でも、stdin のエンコーディングを変えると stdout の方が ShiftJIS(CP932?) に変わってしまって謎すぎる。