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あたりで。