[FreeBSD-users-jp 96342] Re: FreeBSD-11.2 の ja_JP.eucJP 環境

Kouichi Hirabayashi kh @ mogami.com
2018年 10月 24日 (水) 02:51:10 UTC


FreeBSD-11.2 の /bin/sh が ja_JP.eucJP 環境で使えない問題

早トチリで『ja_JP.eucJP 環境で xterm や kterm が使えない』
と書いて混乱させてしまいましたので、整理しておきます。

問題は xterm や kterm ではなくて、/bin/sh でした。

不具合自体は、ja_JP.eucJP 環境で /bin/sh に非 ASCII 文字を
入力すると正常終了してしまうというもので、起動した sh に
<Alt-a> などをキー入力したり、EUC 漢字コードを入力あるいは
paste することで確認できます。

/bin/sh が ja_JP.eucJP 環境で使えなくなってしまった理由は、

  /usr/src/lib/libedit
  /usr/src/bin/sh

の両方が ja_JP.eucJP 環境が使えなくなるように変更されてしまっ
たことにあります。

sh については parser.h で定義される字句構文解析用の文字種識別
token に EUC-JP 漢字コードの 2 byte 目の使用範囲と重複する
値を使ってしまったため、EUC-JP 文字や Atl-A, Alt-B, .. な
どを含む文字列が解釈不能になります。

libedit でも EUC-JP が使えないように書き換えられていますが、
read.c には「#ifdef  KANJI」といったコードが残っていて、そ
の「KANJI」を define すると compile できなくなるといった状
態で、書き換えの真の意図は理解できません。EUC-JP が使えない問
題に関係するのは chartype.c, el.c, read.c といったところ
です。

EUC-JP 環境が必要な状況での対策としては、libedit と sh の
両方を書き換えて EUC-JP が使える sh を作る方法以外に、sh の
使用をあきらめて、csh, tcsh bash, rbash で代替する方法が
あります。

/bin/sh を EUC-JP で使えなくした原因の一つである libedit
のソースの comment

 /* FIONREAD attempts to buffer up multiple bytes, and to make that work
  * properly with partial wide/UTF-8 characters would need some careful work. */

  /*
   * We don't support other multibyte charsets.
   * The second condition shouldn't happen
   * and is here merely for additional safety.
   */

を見ると、ASCII と UTF-8 限定という意図かもしれませんが、も
しそうなら、/bin/sh でも sh を起動した時点で、ja_JP.eucJP
環境の場合は「ja_JP.eucJP は使えない」という警告を出して終
了すべきですし、/bin/sh はシステムの根底の一つですから、
ja_JP.eucJP 自体をなくすといった作業と告知も必要なはずで、
理解に苦しみます。

平林 浩一


freebsd-users-jp メーリングリストの案内