blog.anqou.net
rss
author
tags

OCaml で Camomile を使って文字コードを変換

昨日の記事では Camomile を使い Unicode 正規化を行いました。 Camomile はリッチなライブラリで、文字コードの変換も行うことができます。

使うモジュールは Camomile.CharEncoding です。of_name を使ってエンコーディングを取得し、それを recode_string に渡すことで変換を行うことができます。例えば UTF-8 から SHIFT_JIS への変換は以下のように行えます:

let open Camomile.CharEncoding in
let shiftjis = of_name "SHIFT_JIS" in
let s = recode_string ~in_enc:utf8 ~out_enc:shiftjis "あいうえお" in
assert (s = "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8")

文字コードの自動判定を行いたい場合は automatic を使います。例えば UTF-8 と SHIFT_JIS の中から自動的に判定したい場合は以下のように書きます:

let u8orsjis = automatic "u8orsjis" [ utf8; shiftjis ] utf8 in
let s = recode_string ~in_enc:u8orsjis ~out_enc:utf8 "あいうえお" in
assert (s = "あいうえお");
let s = recode_string ~in_enc:u8orsjis ~out_enc:utf8 "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8" in
assert (s = "あいうえお")

なお日本語で文字コードの変換が発生しそうな EUC-JP・SHIFT_JIS・ISO-2022-JP-2 に関しては、ライブラリ側で japanese_auto_detection という名前で automatic定義されています。そのため、これらの文字コードの判定であれば以下のように書けます:

let jauto = of_name "japanese_auto_detection" in
let s = recode_string ~in_enc:jauto ~out_enc:utf8 "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8" in
assert (s = "あいうえお")