[haskell]iniファイルとexception

ini形式のデータをパースして値を取得できるようにします。また、ファイルが無いときの例外キャッチをできるようにします。

lookupValueやparseIniは例外送出せず、値が見つからなき時はLeft Stringになります。

catchはMonadCatchの型クラスを扱うためIOから抜けだせません。そのようなものなのでしょうか。理解できていません。

iniファイルのフォーマットに沿ってないファイル、単にセクションが見つからないだけです。パースはできています。

ちなみに実行ファイルサイズは4598736バイトでした。

[haskell][BNFC]n3337 Raw-string

n3337のRaw-stringをBNFCで定義する。

うまくパースしてくれているようです。

参考サイト

[haskell][BNFC]Unicodeスカラ値のサロゲートペア範囲考慮

ユニコードスカラ値にはサロゲートペアのための領域0xD800-0xDFFFがあり、この範囲は文字を割り当てることがきない。このためcharの範囲からこの部分を外す。

BNFCはUTF-8で受け取るため、0xD800を無理やりUTF-8へコンバートする。リトルエンディアンであるので最初の0x0aは改行だ。勝手についてくるがおそらくechoかな。

0xeda080をBNFCでパースしてみるが、haskellが受け取ってくれない。

サロゲートペア外の文字コードであれば問題なく受け取るのでパースできる。

BNFCが生成したテスト実行コードを変更してテストしてみる。

テストが成功したので問題なしかな。

[haskell]BNFCでUnicodeを扱える様にする

BNFCのcharは0〜255の文字コードしか扱えない。これをUnicodeの範囲に広げる。

うまくできました。

[haskell]UTF8へのencode

UTF-8へのエンコードは2種類ある。

どちらもUTF-8のコード並びに変換されるが、encodeはWord8、encodeStringはStringの配列に格納される。

最初のStringはUnicodeスカラ値でUnicodeの文字集合全体を扱える。encodeStringはUTF-8にencodeするけれど、Stringに格納するのは混乱がでるかな。できればStringはUnicodeスカラ値のクラスとして統一してほしいところ。

[haskell]内部文字コード

Haskellの文字列扱いを少し

出力結果

Haskell内部ではUnicodeスカラ値で扱われている。

printはどうやらBasic Latinしか文字を表示することができないようで、後は内部コードをそのまま表示している

putStr(Ln)については内部コードに応じたフォントを表示してくれる。

内部コードとUTF-8との変換はencodeString(内部コード >> UTF-8)とdecodeStringを使う。

フォント表示についてはLANG環境変数が影響する。

UTF-8であることをLANGで設定していないと出力で例外となる