MuTerminal localeシステムの提案

naan studio BeOS Multilingual Projectでは、MuTerminal、およびその上で動作する多国語対応コマンドが常に正しく実行できるよう、Be, Inc.が正式対応するまでの間、独自のlocaleシステムを構築することを考えています。ただし、localeシステムと言っても、OSレベルの話ではなく、あくまでもTerminalアプリケーション上での話です。また、私はUNIXのlocale環境を実際に使用したことはありませんし(本で得る知識のみ)、日本語以外の言語のことはさしたる知識も持ちあわせていません。これらの事象に詳しい方のアドバイスを頂ければ幸いです。

シェルとMuTerminalの通信

もし、コマンドがある特定の文字コードにのみしか対応していない場合(たとえば、SJISは扱えるが、UTF8やEUCは扱えない、など)、そのコマンドが実行される前にMuTerminalの文字コードの設定が正しく行われている必要があります。これは、端末エミュレータの性格上、MuTerminalが文字コードを自動判別したり、設定されている文字コード以外の文字コードが出力されたときに正しくエラーチェックするのが困難だからです。

通信用コマンドmt_set

mt_setコマンドは、MuTerminalとメッセージ通信することによって、MuTerminalに現在設定されている文字コードの情報を取得したり、あるいは文字コードを設定したりすることが出来ます。mt_setコマンドをシェルスクリプトで使用することによって、特定の文字コードにしか対応していないコマンドの使用時や、ホストへのログイン時に、正しく動作するようにできます。

例として、MuTerminalからTelnet経由でNiftyServeへログインするシェルスクリプトを以下に示します。

#!/bin/sh
#
# まず、mt_setコマンドを実行している端末がMuTerminalかどうかを
# 判定します。
# "mt_set -v"を実行すると、その端末がMuTerminalの場合は終了コー
# ドが0に、それ以外の時は-1になります。&&は、直前のコマンドの
# 終了コードが0の時だけその次に記述されているコマンドを実行する
# ためのものです。


mt_set -v && {

#
# 現在の文字コードを変数"NOW_CODE"に保存
#
NOW_CODE=`mt_set -c`
#
# コードをSJISに設定。
# mt_set -sで、コードを設定します。
# 同時に、環境変数TTYPEも変更します。
#
mt_set -s SJIS
export TTYPE=SJIS
echo set coding is [$NOW_CODE]

# コマンドを実行
# ここではniftyserveにログインしています。
telnet r2.niftyserve.or.jp

#
# NOW_CODEに保存したコードに戻します。
#
export TTYPE=$NOW_CODE
mt_set -s $NOW_CODE
echo restore coding is [$TTYPE]

}
#end of script

このように、mt_setコマンドを使用することによって、ユーザーは文字コードを意識することなく、常にシェル上のコマンド(アプリケーション)が正しい動作を行うようにすることができます。

mt_setに現在実装されているオプションは次の通りです。

-a MuTerminalから取得できるすべての情報を表示
-c 現在設定されている文字コードを表示
-h ヘルプを表示
-s code 文字コードをcodeに設定する
-v 実行されている端末がMuTerminalかどうかを判定

通信用ライブラリlibmuterm.a

version 1.2から、MuTerminalとの通信を行う関数をライブラリ化しました。私製コマンドなどで、MuTerminalから現在の文字コードを取得したり、変更したい場合に利用して下さい。mt_setコマンドもこのライブラリを用いてMuTerminalと通信しています。なお、通信用ライブラリは、~/config/libにインストールされます。

現在、ライブラリに登録されている関数は次の通りです。

int check_MuTerminal (void) 実行端末がMuTerminalがどうかをチェックする。MuTerminalなら0、それ以外は-1がリターンする。
int get_coding (void) 現在のMuTerminalのコーディングを返す。エラーなら-1が返ってくる。
int set_coding (int32 coding) MuTerminalのコーディングをcodingにする。

利用する場合はmuterm.hをインクルードしたうえで、コンパイルオプションに-lmutermを加えます。関数から返ってくる整数値とコーディングとの対応はmuterm.hを参考にして下さい。

環境変数LANG

環境変数LANGは、UNIXのフォーマットをそのまま採用して、

国_言語_文字コード

というフォーマットで現在の設定を保存します。日本語EUCならば

ja_JP.ujis

になります。言語情報は現在のところ未実装です。


MuTerminal Help File : locale.html,v
Last modified : 1999/10/02 15:10:38