2014年1月31日金曜日

[OCaml]Unicodeライブラリ Camomile

今時の言語はUnicodeはサポートされているんだろうと思って、日本語の文字列の長さを調べてみたら、
utop[5]> String.length "日本語";;
- : int = 9
正しい値が返ってこない。バイト長を返している...
いろいろ調べてみると、OCamlでは外部ライブラリを使わないと、Unicodeとして扱えないようだった。
Stackover flowで、Camomileがお勧めされていたので、試してみた。

インストール

Camomileはopamでインストールできる。
~$ opam search camomile
Available packages for system:
camomile  0.8.5  A comprehensive Unicode library
zed         1.2  Abstract engine for text edition in OCaml
~$ opam install camomile
[NOTE] Package camomile is already installed (current version is 0.8.5).

おっと。いつのまにかインストールされていた。

ドキュメントの生成

.opamの中にアーカイブされたライブラリのソースがあるので、それを使おう。
~/src$ cp ~/.opam/packages.dev/camomile.0.8.5/camomile-0.8.5.tar.bz2 ./
~/src$ tar jxf camomile-0.8.5.tar.bz2
~/src$ cd camomile-0.8.5
~/src/camomile-0.8.5$ ./configure

config.status: WARNING:  'Makefile.in' seems to ignore the --datarootdir setting
という警告が出るが、ドキュメントを生成するだけなので放置する。
~/src/camomile-0.8.5$ make
~/src/camomile-0.8.5$ make dochtml

dochtmlディレクトリにドキュメントが生成される。
~/src/camomile-0.8.5$ cd dochtml
index.htmlを開けば良い。
~/src/camomile-0.8.5/dochtml$ iceweasel index.html

試してみる

utop[0]> open CamomileLibrary;;
utop[1]> let s = "日本語";;

val s : string = "日本語"
utop[2]> String.length s;;
- : int = 9
utop[3]> UTF8.length s;;
- : int = 3

正しい文字長である3が返った。

本当は XString.length を使いたかったのだけど、
string を xstring にする関数を見付けられなかった。
どう書くのだろう。

参考