Home > 3月 26th, 2013

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