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?) に変わってしまって謎すぎる。