文字列関係で, よく必要になるモジュールを紹介。text-icu パッケージを使います。
# cabal install --dry-run --global text-icu
libicu-devel rpmパッケージを事前にインストールしておくこと。
Unicode を扱うときは正規化が欠かせない。ただのテキストは NFC, インデックスのように使うフィールドでは NFKC を適用することが多い。
normalize :: NormalizationMode -> Text -> Text
NormalizationModeデータ型の値としては、次から選ぶ;
| NFD | 正規分解 (Canonical Decomposition) |
| NFKD | 互換分解 (Compatibility Decomposition) |
| NFC | 正規分解 + 正規合成 (Canonical Composition) |
| NFKC | 互換分解 + 正規合成 |
非Unicode 文字コードとの相互変換。
まず、シフトJISで、次のファイルを用意する。
sjis.txt
このファイルはShift_JIS①②km㈱ 涖涬淏淸淲淼渹湜渧渼
変換するコード. Converterデータ型を使う。
シフトJISは, "ibm-943_P15A-2003", "Windows-31J" または "MS932" のいずれかを指定する。どれでも同じ。"cp932" は異なる変換表のことかあり、避けるのが無難。
open :: String -> Maybe Bool -> IO Converter
使える文字コードとその別名については, Converter Explorer
toUnicode :: Converter -> ByteString -> Text
実行結果:
Converter "ibm-943_P15A-2003" このファイルはShift_JIS①②km㈱ 涖涬淏淸淲淼渹湜渧渼
Haskell には, パーサコンビネータ parsec パッケージがあり、標準インストールされる。これがあれば、正規表現の出番があまりない、か。
正規表現は, regex-compat パッケージのText.Regexモジュールもある。ただし, String を使っている。
text-icu パッケージの Data.Text.ICU.Regexモジュールが Text を使う。
実行結果
Match ["\12405\12364\12405\12364\12411","\12405\12364"]
regex :: [MatchOption] -> Text -> Regex
find :: Regex -> Text -> Maybe Match