概要
概要
環境変数の設定法と,それに関連する諸注意を述べます. 記述の対象とした言語は,あくまで私が実際に使った経験のあるものに限定しています. (他の言語でも,要領は同じでしょう.)
なお,以下の記述は,FreeBSD 6.2 に関するものです.
言語に関係する環境変数は,LANG や LC_* (LC_ALL 等) です. LANG は,FreeBSD の慣習として ~/.login_conf によって規定します. 新たに user を登録した際に作成されるこのファイルは,以下のようになっています. (その行の '#' 以後はコメントです.)
#me:\ # :charset=iso-8859-1:\ # :lang=de_DE.ISO8859-1:
ドイツ語環境にしたければ,これら三行の '#' を消します. また,日本語環境にしたければ,次のように変更します.
me:\ :charset=eucJP:\ :lang=ja_JP.eucJP:
参考までに,私の ~/.login_conf はこうしています. (実用というより検討用ですが.)
me: :charset=eucJP: :lang=ja_JP.eucJP: #me: :charset=iso-8859-1: :lang=en_US.ISO8859-1: #me: :charset=iso-8859-1: :lang=de_DE.ISO8859-1: #me: :charset=iso-8859-1: :lang=fr_FR.ISO8859-1: #me: :charset=iso-8859-15: :lang=fr_FR.ISO8859-15: #me: :charset=iso-8859-5: :lang=ru_RU.ISO8859-5: #me: :charset=KOI8-R: :lang=ru_RU.KOI8-R:
また,~/.login_conf に頼りたくない場合には,~/.login にて次のように規定します.
setenv LANG ja_JP.eucJP #setenv LANG en_US.ISO8859-1 #setenv LANG de_DE.ISO8859-1 #setenv LANG fr_FR.ISO8859-1 #setenv LANG fr_FR.ISO8859-15 #setenv LANG ru_RU.ISO8859-5 #setenv LANG ru_RU.KOI8-R
LC_ALL もこの ~/.login にて規定します.
これら環境変数の設定状態を知りたければ,次のようにします. (これは FreeBSD 4 系にはありません.)
% locale LANG=ja_JP.eucJP LC_CTYPE="ja_JP.eucJP" ← 文字の照合順序 LC_COLLATE="ja_JP.eucJP" ← 文字に関する情報 LC_TIME="ja_JP.eucJP" ← 時刻の表記 LC_NUMERIC="ja_JP.eucJP" ← 数値の表記 LC_MONETARY="ja_JP.eucJP" ← 通貨の表記 LC_MESSAGES="ja_JP.eucJP" ← その他のメッセージ LC_ALL=ja_JP.eucJP ← 全ロケール属性
各々の環境変数の意味は以下を参照して下さい.
% jman setlocale % jman environ
プログラムには,環境変数 LANG 等を読み込んで言語環境を判別してくれるものとそうでないものがあります. 後者に関しては,LANG 等に応じてそのプログラム独自の環境変数を規定する必要のあるものがあります.
また前者の場合にも,default 以外の動作を指定する場合など,きめ細かな設定が可能な場合が多いです. その典型的な例は,X Window System における Window Manager, terminal, emacs 等へのフォントの指定です.[1]
環境変数 LANG や LC_* に応じて環境変数を規定する必要のあるプログラムを例示します.
(1) jless : 文字化けを起こさないために,どれか一つを設定します. (選択肢はさらに多数あります.)
setenv JLESSCHARSET euc setenv JLESSCHARSET iso8859 setenv JLESSCHARSET koi8-r
(2) sed (ports/japanese/sed): EUC の文書の処理に必要です.[2]
setenv SEDMB_ENABLE
(3) tcsh : ja_JP.eucJP の環境にて使う場合,次のように設定します.
set dspmbyte=euc
逆の例として,そのプログラムが環境変数 LANG や LC_* を読み込んで言語環境を判別してくれているのだが,それを抑制したいという場合があります.
例えば,日本語環境では ls -l を実行して表示される日付の月の部分は数字になります.
(tar -t でも同様です.)
それを英語で表示したい場合,次のようにします.
% env LC_ALL=C ls -l
これは,~/.cshrc にて次のような alias を定義しておくと便利でしょう.
alias ll '(env LC_ALL=C ls -lF \!*) | more'
いくつもの言語環境を使う場合には,言語ごとに,また FreeBSD や ports/packages の version ごとに,これらの特性を把握し,かつそれを .login や .cshrc によって以下のように自動的に反映させるようにしておなかいと,間違いが起こりやすいです.
if ( $LANG == "ja_JP.eucJP" ) then setenv JLESSCHARSET euc else if ( $LANG == "de_DE.ISO8859-1" ) then setenv JLESSCHARSET iso8859 else if ( $LANG == "fr_FR.ISO8859-1" ) then setenv JLESSCHARSET iso8859 else if ( $LANG == "ru_RU.KOI8-R" ) then setenv JLESSCHARSET koi8-r endif
[1] フォントの変更法は,プログラムごとに流儀が異なること,仕様変更も少なくないが文書がそれに追い付いていないことなどから,試みて簡単にできるかいつまでもうまく行かないかの両極端です. 後者の場合,下手に資料を探すよりもソースを見た方が解決の近道である場合が多いです.
[2] この環境変数のことを何から知ったのか記録に残っていません. これは FreeBSD 3.4 では必要なかったのですが,少なくとも FreeBSD 4.7 から必要になりました. FreeBSD 4.11 でも必要です. うちには FreeBSD 5.3, 6.2 もあるのですが,この環境変数なしの動作は試していません.
ports/japanese/sed/work/sed-3.02/ にて sed のソースを見ます. config.h に次のような箇所があります.
/* default multi-byte character set */
/* #undef ASCII */
/* #undef SJIS */
#define EUC 1
/* #undef UTF8 */
それにより,sed/sed.c にて default の多バイト文字コードとして EUC が選択されます. ただし,
#ifdef EUC # define DEFAULT_MBCTYPE MBCTYPE_EUC #endif (略) myname = sed_name(argv[0]); if (myname[0] == 'j' || myname[0] == 'J') { ← プログラム名が j または J で始まっていたら mbcinit(DEFAULT_MBCTYPE); (略) } else if (getenv("SEDMB_ENABLE")) { ← 環境変数 SEDMB_ENABLE が定義されていたら mbcinit(DEFAULT_MBCTYPE); }
このように,default と言ってもユーザーが何もしない状態で有効になっているわけではありません.
面倒がらずに option -W ctype=character-set, --ctype=character-set を使う方が無難かもしれません.
もう一つ注意しなければならないのは,ports/japanese/sed で導入される /usr/local/bin/sed の他に,標準で備わった /usr/bin/sed もあり,「普通に」path を設定すると "sed" として後者が選ばれることです.
% which sed /usr/bin/sed
/usr/bin/sed には version を表示する option -V はないので,その点からも区別が付きます.
% /usr/local/bin/sed -V
GNU sed version 3.02 + multi-byte extension 1.09
jless, jgrep, jman のように,日本語対応した sed には 'j' を付けて欲しいところです.