Hatena::ブログ(Diary)

Oh, you `re no (fun _ → more) このページをアンテナに追加 RSSフィード

Ah well, a dromedary has one hump and a caml has reference cells, buffers, and a garbage collector.

2009-08-03

OCaml コード中の日本語(特に Shift_JIS) の扱いと OCaml 大駱駝パッチ

OCaml の対話型インタプリタ文字コード (一人読書会番外編) http://d.hatena.ne.jp/h810tsukagoshi/20090802/1249233046

OCaml, 一人読書会 ( プログラミングの基礎 )

問 4.8 をやっていたときのこと。

# #use "C:/Program Files/Objective Caml/mylib/tsurukame.ml";;
File "C:/Program Files/Objective Caml/mylib/tsurukame.ml", line 1, characters 1-2:
Error: Illegal character ()

このエラーしか出なくなった。

色々試してみた結果、どうやらこのインタプリタは ANSI 文字コードしか通らないらしいことが分かった。

[中略]

意外とこのことに関する日本語の情報が少ないな。

だそうなので書いてみました。まあ今までも似たようなことを書いてきましたが、そのまとめバージョンです。

OCaml プログラムの文字コードについて

OCaml は ANSI より広い ISO8859-1 で書かれたソースコードを受け取ります。結果、というか、これが動機なのですが、フランス人はコード中に自国語のアクセント記号のついた変数を定義することが出来ます。Caml-light のフランス語教科書などに例があります。

ただし文字列に関しては EUC, UTF-8 など、ANSI 領域のキャラクタ (" や \) が出現しないコードであればそれなりに正しく動作します*1。変数等を EUC, UTF-8 で書きたいという奇特な方は大昔に書いたこの情報をお読みください。やらないほうがよいです。というか、やる人がいるとは思えません。

OCaml プログラム中で Shift_JIS の文字列を扱う

なお、Shift_JIS は漢字中に \ が出現するため文字列の解釈がおかしくなり、エラーになります。(参考)

私はこの浅井先生の本

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)

を持っていないので確認はしていないのですが、どうやら漢字文字列が例で使われているようで、Windows の OCaml を使っている人はこの Shift_JIS の問題でつまづくようです。この問題に対処するために、 Shift_JIS 文字列を認識する(ただし EUC, UTF-8 はおかしくなる可能性のある) Windows 用 OCaml バイナリ(MSVC と MinGW版。Cygwin はいらないよね?) を http://jun.furuse.info/hacks/orakuda/ (スクリーンショット)に置いておきましたのでどうぞご利用ください。

しかし、 id:h810tsukagoshi さんの例だとコードの頭に変なキャラクタがあったようなんだけど、何をやったんだろう?

*1id:ytqwerty さんが指摘されたとおり、String.uppercase などの大文字小文字変換は ISO8859-1 を意識して動くので日本語が潰れます。

h810tsukagoshih810tsukagoshi 2009/08/07 09:44 初めまして。
非常に参考になりました。

エラーが出ていたときのエディタのエンコードが UTF-8 になっていたので、それが原因で最初の # の時点で引っかかっていたようでした。

camlspottercamlspotter 2009/08/11 09:44 後のエントリでも書きましたが、UTF-8 の BOM をファイル先頭にくっつけるエディタの問題のようです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証