Camomile

OCaml用のUnicode処理ライブラリです。文字コードの処理をしたいとき使えます。

現在GODIに入っているのは0.6系です。0.7系を使いたい場合は取得してきて自分でconfigure&make installしましょう。0.7系は名前空間がかわっているので注意してください。CharEncodingモジュールはConfigureというfunctorで設定を与えてから実体?を得るようになっているため、以前と同じコードでは使えません。CamomileLibrary.Default.Camomileで今までと同じCamomileモジュールが使えるので、Camomileと書いてあった場所をこれに直せばとりあえず使えるはずです。

文字コード変換

stringからstringに変換

val recode_string : in_enc:t ->
       out_enc:t -> string -> string

recode_string ~in_enc ~out_enc s converts the string s from in_enc to out_enc.

in_encとout_encにはencodingを表すCharEnconding.t型オブジェクトを渡す。ドキュメントのShortcutsに書いてあるようにASCIIやUTF-8等を表すencodingはオブジェクト変数を参照すれば直ちに得られるが、それ以外のencodingはof_nameメソッドに「codeset name」を与えて取得しなければいけない。「codeset name」はCamomileが使うencodingの識別子で、ソースツリーのcharmapsディレクトリにあるcharmapファイルの先頭に記述されている。大抵はファイル名と同じ。IANAの文字セット名割り当てリストに従っているのでこれを参照してもよい。

EUC-JPを表すencodingオブジェクトを取得するには以下

Camomile.CharEncoding.of_name "EUC-JP"

以下のencodingはショートカットが用意されている

ascii, latin1, utf8, utf16, utf16be, utf16le, utf32, utf32be, utf32le, ucs4

たとえば、outbufの内容をEUC-JPからUTF-8へ変換する場合は以下のようにする。

(Camomile.CharEncoding.recode_string
 (Camomile.CharEncoding.of_name "EUC-JP")
 Camomile.CharEncoding.utf8
 (Buffer.contents outbuf)

Pervasives.in_channelからPervasives.out_channelへ (0.7系)

コードが煩雑にならないようにmoduleにエイリアスをつけます

module C = CamomileLibrary.Default.Camomile;;

以下の例ではCharEncoding.in_channelメソッドを用いて一端 [UChar.t] OOChannel.obj_input_channel 型オブジェクトに変換して1024バイト単位でコピーを行う。

let inc =
  new C.CharEncoding.convert_uchar_input
    (C.CharEncoding.of_name "SHIFT_JIS")
    (new C.CharEncoding.in_channel
       (C.CharEncoding.of_name "EUC-JP")
       stdin) in
let buf = String.create 1024 in
let rlen = ref 0 in
  while rlen := inc#input buf 0 1024; !rlen != 0 do
    output stdout buf 0 !rlen
  done;;

次の例ではCharEncoding.convert_inputメソッドを用いて OOChannel.char_input_channel 同士の間でコピーを行う。

let inc = new CamomileLibrary.OOChannel.of_in_channel stdin
and outc = new CamomileLibrary.OOChannel.of_out_channel stdout in
let incsjis =
  new C.CharEncoding.convert_input
    (C.CharEncoding.of_name "EUC-JP")
    (C.CharEncoding.of_name "SHIFT_JIS")
    inc in
let buf = String.create 1024 in
let rlen = ref 0 in
  while rlen := incsjis#input buf 0 1024; !rlen != 0 do
    while !rlen != 0 do
      rlen := !rlen - outc#output buf 0 !rlen
    done
  done;;

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-03-24 (土) 12:42:43