「プログラム」カテゴリーアーカイブ

[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で設定していないと出力で例外となる

[haskell]ディレクトリのリストを出力する

ディレクトリのリストを出力する。ファイル内容を出力する時と同じ要領で作ることができた。

  • dirsから”.”と”..”を除いたリストに対しmapM_でputStarLnをマップしている

haskell事始め

haskellをはじてみる。まずはファイルを扱えるようになることから。以下のコードでファイルの内容を出力するプログラムができる。

  • getArgsは引数を[String]で返してくれる。'<-‘は結果をargsに束縛する。
  • case args of は条件分岐
  • argsが'[]’空リストなら getContentsアクションの結果をputStrアクションに渡す。
  • それ以外なら、argsの各要素に無名関数(\x -> readFile x >>= putStr)をマップ

参照サイト