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