* [[Camomile:http://camomile.sourceforge.net/index.html.ja.jis]] [#pe6136d3]
OCaml用のUnicode処理ライブラリです。文字コードの処理をしたいとき使えます。現在GODIに入っているのは0.6系です。0.7系を使いたい場合は取得してきて自分でconfigure&make installしましょう
OCaml用のUnicode処理ライブラリです。文字コードの処理をしたいとき使えます。

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

- [[0.7系 APIマニュアル:http://camomile.sourceforge.net/dochtml/index.html]]
- [[0.6系 APIマニュアル:http://camomile.sourceforge.net/dochtml-0.6/index.html]]

** 文字コード変換 [#o0cc1951]
//一日ほど大嘘を書いてました。失礼

*** stringからstringに変換 [#oeb70800]
//[[CharEncoding:http://camomile.sourceforge.net/dochtml/CharEncoding.html]] を用いる。0.7系から「Interface」を付けなきゃいけなくなったので0.6系の人はこれを除いて読んでください。

 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の文字セット名割り当てリスト:http://www.iana.org/assignments/character-sets]]に従っているのでこれを参照してもよい。

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系) [#n9e38a75]
コードが煩雑にならないように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