文字列関係で, よく必要になるモジュールを紹介。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