2013.03.26
Haskell使ってWindows上でJISで書かれたファイルをSJIS(CP932)に変換して表示してみた
コードこんな感じ。
{-# LANGUAGE ImplicitParams #-} import Prelude hiding (getContents,putStrLn,readFile) import System.IO.Encoding import Codec.Text.IConv import Data.Encoding import Data.Encoding.ISO2022JP import Data.Encoding.CP932 main = do let ?enc = ISO2022JP s <- System.IO.Encoding.readFile "test.txt" let bs = Data.Encoding.encodeLazyByteString ISO2022JP s let sbs = Codec.Text.IConv.convert "ISO-2022-JP" "CP932" bs let ss = Data.Encoding.decodeLazyByteString CP932 sbs let ?enc = CP932 System.IO.Encoding.putStrLn ss return ()
System.IO.EncodingのreadFile使ってISO2022JPで文字コードを指定して読み込み。
読み込んだ文字列をencodeLazyByteString使って文字コード指定してByteStringに変換。
convert使ってISO-2022-JPからCP932に変換。
convertの結果のByteStringをCP932の文字コードを指定してdecodeLazyByteStringでStringに変換。
最後にCP932の文字コードを指定してputStrLnで画面出力でCP932で出力できたよ。
Data.Encoding.CP932はまだ対応してなかったので実装した。
ついでにData.Encoding.SJISもコード表作ってみた。
そのうち本家に取り込むかpatch載せるかしよう。
======
2013/5/28 追記
これを本家に突っ込むほどのモチベーションが沸かなかったので
とりあえずpatchの直リン貼り。
encoding-0.6.7.2へのpatchファイルになってます。
https://raw.github.com/endhrk/encoding/master/encoding.diff
======
2016/8/23 追記
このパッケージをまた使うことになりいよいよ面倒なので本家にパッチを送信。
encoding-0.8.1で取り込まれました。
https://hackage.haskell.org/package/encoding