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 にする関数を見付けられなかった。
どう書くのだろう。
0 件のコメント:
コメントを投稿