OCamlの対話環境の日本語文字列
いろいろな人に教えてもらって、最近のバージョンでも過去のバージョンでも、普通に
> env LANG=en_US ./ocaml Objective Caml version 3.10+dev9 (2006-09-18) # "隣の柿はよく客食う柿だ" ;; - : string = "隣の柿はよく客食う柿だ" #
となることがソースコードより発覚(端末の文字コードはEUC)。toplevel/toploop.mlのprint_out_phraseからtyping/oprint.mlのprint_out_valueが呼ばれて、書式指定文字列の"%S"でstdlib/string.mlのesacpedが呼ばれて、byterun/str.cのcaml_is_printableが呼ばれて、
CAMLprim value caml_is_printable(value chr) { int c; #ifdef HAS_LOCALE static int locale_is_set = 0; if (! locale_is_set) { setlocale(LC_CTYPE, ""); locale_is_set = 1; } #endif c = Int_val(chr); return Val_bool(isprint(c)); }
となっていて、EUCの2バイト文字はISO-8859-1の8ビット文字に含まれている(という言い方はおかしいが)ためらしい。ひょっとして皆知ってた…?
追記:どのLANGが存在して、どういう文字がprintableになるかは、その環境のlocaleデータベースによるみたいです。よく(というかまったく)わかっていないのですが、何かlocale -aで見られるみたいです。frがあればfrのほうがいいかも。
そもそも、何で(うちでは)en_USでLatin-1が通るのかよくわからないし…。登録商標記号とかセント記号のため?←トラックバックしてくださったyuriyukiさんのブログへのコメントで聞いてしまったのですが、よく考えると向こうで聞くのも変なので消してこっちへ。すみません。
あと、LANGよりLC_ALLやLC_CTYPEが優先するかも。この辺は僕は本当にド素人なので、正確なことはman -k localeあたりで。