hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2011-07-18

GHCでtext-icuパッケージを使ってみた

HackageDB: text-icu-0.6.3.4
試した環境は、Scientific Linux 6.0、GHC 7.0.3。

インストール
$ sudo yum install libicu-devel
$ cabal install text-icu

SJISのファイルを読み込んでUTF-8に変換して表示するサンプル。
import Data.Text.ICU.Convert as C
import Data.ByteString as B

main = do
    str <- B.readFile "hello_sjis.txt"
    cp932 <- C.open "cp932" (Just False)
    utf8 <- C.open "utf8" (Just False)
    B.putStr (C.fromUnicode utf8 (C.toUnicode cp932 str))
toUnicodeの戻り値の型はData.TextではなくData.Text.Internal.Textです。で、表示の仕方がよくわからないので、UTF8のByteStringに変換して出力することにしました。

サンプルデータファイルhello_sjis.txt

こんにちは①です
で試したところ丸付き数字もちゃんと表示されました。

なお、Data.Text.ICU.Convert.converterNamesを実行してみるとcp932は含まれていないのですが、 ICU Demonstration - Converter Explorerを見ると、ibm-923_P100-1998とibm-942_P12A-1999のエイリアスになっています。Data.Text.ICU.Convert.aliasesで確認できます。

Prelude Data.Text.ICU.Convert> Data.Text.ICU.Convert.aliases "cp932"
Loading package bytestring-0.9.1.10 ... linking ... done.
Loading package array-0.3.0.2 ... linking ... done.
Loading package containers-0.4.0.0 ... linking ... done.
Loading package deepseq-1.1.0.2 ... linking ... done.
Loading package text-0.11.0.6 ... linking ... done.
Loading package text-icu-0.6.3.4 ... linking ... done.
["ibm-943_P15A-2003","ibm-943","Shift_JIS","MS_Kanji","csShiftJIS","windows-31j","csWindows31J","x-sjis","x-ms-cp932","cp932","windows-932","cp943c","IBM-943C","ms932","pck","sjis","ibm-943_VSUB_VPUA"]
Prelude Data.Text.ICU.Convert> aliases "ibm-943_P15A-2003"
["ibm-943_P15A-2003","ibm-943","Shift_JIS","MS_Kanji","csShiftJIS","windows-31j","csWindows31J","x-sjis","x-ms-cp932","cp932","windows-932","cp943c","IBM-943C","ms932","pck","sjis","ibm-943_VSUB_VPUA"]
Prelude Data.Text.ICU.Convert> aliases "ibm-942_P12A-1999"
["ibm-942_P12A-1999","ibm-942","ibm-932","cp932","shift_jis78","sjis78","ibm-942_VSUB_VPUA","ibm-932_VSUB_VPUA"]

それとtext-icuはCのライブラリを呼び出しているので、あまり大きな文字列を渡すのは避けた方が良いです。上のコードはサンプルなのでファイル全体にしていますが、サイズが大きいファイルのときは行単位にしたほうがよいと思います。

ブログ アーカイブ