shokosブログ

プログラミング

ghc7.0.4で、バイト文字列を日本語ファイル名で保存する方法

環境はmac、ghc7.0.4

yesodアプリケーションで、アップロードされた画像ファイルをローカルに保存するときに、日本語ファイル名だと文字化けしてしまう問題が発生した。

どうやらghc7.0.4は日本語ファイル名に対応していないっぽい。

Haskell-jaに質問を投げてアドバイスをもらった結果、ファイル名をCodec.Binary.UTF8.String. encodeStringでenncodeしてあげるとうまくいった!

import Data.ByteString as B
import Codec.Binary.UTF8.String as S

main :: IO ()
main = do
    body <- B.readFile "hoge.jpg"
    B.writeFile (S.encodeString "ほげ.jpg") body

もしバイト文字じゃなくただの文字列の場合は、System.IO.UTF8のwriteFileで日本語ファイル名が保存できる。
ghc7.4からは日本語ファイル名対応するらしいので、はやく付属のHaskell Platformがでてほしいところ。