RSS

Haskellでエンコード周辺

SJISのファイルを扱うのに苦労した。適当にやるとinvalite byte sequenceとエラー吐かれて終了。きちんと変換しないといけない。

import Codec.Text.IConv
import Data.ByteString.Lazy.Char8 (pack, unpack)
import qualified Data.ByteString.Lazy.Char8 as BS
import Codec.Binary.UTF8.String

inFile = "z_sjis.txt"

main = do 
  cs <- BS.readFile inFile
  let u8s = convert "CP932" "UTF-8" cs
  -- OK
  BS.putStr u8s 
  putStr $ decodeString (unpack  u8s) 
  -- NG
  putStr (unpack  u8s)
  putStr (unpack (convert "UTF-8" "ISO-2022-JP" u8s))  
  putStr (unpack (convert "UTF-8" "EUC-JP" u8s))
  putStr (unpack (convert "UTF-8" "CP932" u8s))

z_sjis.txtをShift JISで作成する。どういう理屈かいまいちわかってないがdecodeStringもかけないといけないらしい。ターミナルで吐かせているだけだとなんとなく読めるようになったりするのできちんと検証が必要。以下のようにして数値にして確認した。

$ runghc ex_iconv.hs |perl -n -e '@s=unpack("C*", $_);print "[@s]\n"'