ubuntu9.10上のhaskell(ghc)でUTF8を扱うには

追記 2010/08/20 13:21:22:

ubuntu10.04以降ではhaskellのバージョンが上がって以下の問題は起きないらしい。
http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/480

追記ここまで

そこで色んな対処方があるのですが、utf8-string という素敵なパッケージがありますので、これを使います。

ここで情報を得たのでubuntuには標準パッケージとしてutf8-stringが用意されていた

$ sudo aptitude install libghc6-utf8-string-dev

使い方

import qualified System.IO.UTF8
main=System.IO.UTF8.putStrLn "こんにちわ世界"

とか

import qualified System.IO.UTF8 as U
main=U.putStrLn "こんにちわ世界"

注意すべき点は System.IO.UTF8.printでは化けてしまうこと

Prelude> :m System.IO.UTF8
Prelude System.IO.UTF8> System.IO.UTF8.print "こんにちわ世界"
Loading package bytestring-0.9.1.4 ... linking ... done.
Loading package utf8-string-0.3.5 ... linking ... done.
"\12371\12435\12395\12385\12431\19990\30028"

せっかくprint使う癖がついたのに…

もうちょっと先に行ってみる。標準入力とソースコードのUTF8文字列の扱いは

main=do
  putStrLn "hello world"
  s <- getLine
  putStrLn $ "こんにちわ"++s++"世界"

これを実行すると

 hello world
こんにちわ
S\223ka\217こんにちわ^VL

うーん、やっぱりソースの方が化けるよな。

import System.IO.UTF8
puts = System.IO.UTF8.putStrLn
gets = System.IO.UTF8.getLine

main=do
  puts "hello world"
  s <- gets
  puts $ "こんにちわ"++s++"世界"

内部エンコードがUTF8になったときには puts=puStrLnって定義入れればいいだけだとおもう