- コマンドラインで日本語を - on Mac OS X カウンタ:Total(Today,Yesterday)

←ホームページ

vimとnvi-m17nのページへ→


注意このページの内容については、何ら動作を保証するものではありません。使用するときは個人の責任でお願いします。

JTermnalとnkf, imdkcv、そしてmccc

Mac OS Xにはコマンドを打ち込んで様々な操作を行うための"Terminal"というアプリケーションが入っています。(/Applications/Utilities内) でも、Terminalでは現在(Mac OS X 10.1.3)のところ、日本語(というか2byte文字)入力はおろか日本語表示さえできません。

ということで、「CUIで日本語を使える環境をでっちあげよう!」というのが今回のテーマです。

JTerminal

まず、Terminalの代りにKusamaさんのJTerminalを使うことによって日本語(EUC)表示ができるようになります。
実は、JTerminal自体は日本語入力もできるのですが、OS XにインストールされているShell(デフォールトではtcsh)が日本語を通さないもので、結果として日本語入力ができないのです(;_;) このあたりの対処法はbashとtcshのページで書くことにします。

JTerminalはソースコードで配付されていますから、実行型式(JTerminal.app)を作成するために、Developer Toolsをインストールしておく必要があります。配布されているJTerminalを解凍するとProject Builder用のファイル一式が入っていますから、その中の"JTerminal.pbproj"というファイルをダブルクリックするとProject Builderが立ち上がると思います。

あとは、左上のbuildボタンをクリックして暫く待てば、buildフォルダの中にJTerminalが出来あがっていますので、適当な場所にコピー(その場で使っても良いですが)すればおしまいです。

使い方はOS X付属のTerminalとほぼ同じですから、説明する必要もないでしょう。で、例えばhegehoge.txtというファイルに日本語(EUC)で書かれたファイルが入っているとすると、次のようにすれば、日本語表示されるのが分かると思います。

% cat hegehoge.txt
これはテストのだめのファイルだよーん
    :
    :
%
"%"はプロンプトです。(以下同じ)

ちなみに、OS Xが標準で持っているページャのmoreやlessは日本語を通しません。ですからJTerminal上でless hegehoge.txtなどとやっても、日本語部分は文字化けしてしまいます(;_;) このあたりの対処法は日本語lessのページで書くことにします。

ところで、JTerminalが扱えるのは日本語EUCだけですから、lsコマンドなどを使って、UTF-8で表現されている日本語ファイル名を表示させようとしてもそのままではうまく行きません。こんな場合は白山さんのNJEを使うと次のように表示することはできるようになります。

% ls -v
hogehage.txt    なんだこれ.txt    駄目だこりゃ.txt   ...
    :
    :
%

でも、いろいろ問題もあるようですし、CUIで日本語ファイル名を見たりする必要性も少ないですから、今はNJEは使っていません。どうしても日本語ファイル名を見たい時は、 いまでぃさんのimdkcvや、iconvなどの漢字コードコンバータを使って表示する事ができます。

% ls -vC | imdkcv -U8 -e
hogehage.txt    なんた・これ.txt    駄目た・こりゃ.txt   ...
    :
    :
%

...と、思ったのですが、上記の通り、濁点などが正常に表示されません。しかたがないので、mcccというUTF-8からEUCへの変換を行うだけのちょっとしたコマンドラインユーティリティを作ってしまいました。これについては後ほど書くことにして、その前に...

nkfとimdkcv

nkfはかなり有名な漢字コードコンバータですから知っている人も多いと思います。nkfは比較的簡単に使えるようにできますが、ちょっとした注意点もあります。そのおおよその手順は以下の通りです。

  1. ftp://ftp.ie.u-ryukyu.ac.jp/pub/software/kono/あたりからnkf192.sharを拾ってくる。
  2. nkf192.sharに実行パーミッションを付ける。
  3. nkf192.sharがエラーを起こさないように"NKF"という名前のディレクトリをその場に作成しておく。
  4. nkf192.sharを実行する。
  5. "NKF"というディレクトリ名を適当に(NKFPLとでも)変更(*)しておく。
  6. makeを実行する。
  7. できたnkfを適当な場所(pathが通っている場所がベター。その後rehashをするのが吉)に移動する。
  8. nkf.1をmanで利用できる場所にコピーする。
  9. nkf.1jの文字コードをEUCに変更し日本語manで利用できる場所にnkf.1という名前にかえて移動する。
(*):ファイルシステムがHFS+の場合、ファイル(フォルダ)名の大文字と小文字を区別しないので、"NKF"というフォルダが存在すると"nkf"というファイル(プログラム)がうまく作成できないため、名称変更する。ちなみに"NKF"フォルダの中にはperlで利用できるnkfが入っているが、今回は利用しないのでパス。なお、ファイルシステムとしてUFSを使っているときは名称変更の必要は無い。

例えば、上記シーケンスの2.以降は以下のようになります。

% mkdir NKF
% ./nkf192.shar
    :
% mv NKF NKFPL
% make
    :
% mv nkf ~/bin/
% rehash
% sudo cp -p nkf.1 /usr/local/man/man1/
    :
% cat nkf.1j | nkf -e > nkf.1euc
% sudo mv nkf.1euc /usr/local/man/ja/man1/nkf.1
%

OS X標準のmanページは/usr/share/manですが、OS Xがアップデートされても消えてしまわないように、/usr/local/manにmanページを入れておくことにします。この場合(shellとしてtcshを使っているなら).tcshrcファイルか.loginファイルで環境変数MANPATHに設定しておくのが便利でしょう。

% echo 'setenv MANPATH /usr/local/man:${MANPATH}' >> .login
%

なお、OS Xに標準でインストールされているmanでは日本語のmanページを表示できません。このあたりの対処方法は日本語manのページで説明します。

さて、nkfを使えば、例えば次のようにしてEUC以外の日本語コードで書かれたファイルも表示することができます。

% cat hegohoge2.txt | nkf -e
%

しかしながら、nkfはutf-8には対応していませんので、utf-8で書かれた文書ファイルを表示したり、日本語ファイル名を表示したりすることができません。そこでutf-8に対応した文字コードコンバータであるimdkcvをインストールすることにします。手準は以下の通りです。

  1. http://www.d2.dion.ne.jp/~imady/imdkcv/imdkcv.htmlあたりからimdkcv-1.0.6.tar.gzを拾ってくる。
  2. 適当な場所で解凍・展開する。
  3. configureを起動してMakefileなどを作成する。
  4. makeを実行する。
  5. できたimdkcvプログラムなどをインストールする。
  6. 日本語のmanファイル(imdkcv.1)が英語用のmanページに置かれてしまうので、日本語用のページに移動する。
  7. imdkcv.1eを英語用のmanページにimdkcv.1という名前にかえてコピーする。

例えば、上記シーケンスの2.以降は以下のようになります。

% tar xvfz imdkcv-1.0.6.tar.gz
    :
% cd imdkcv-1.0.6
% ./configure
    :
% make
    :
% sudo make install
    :
% rehash
% sudo mv /usr/local/man/man1/imdkcv.1 /usr/local/man/ja/man1/
% sudo cp -p imdkcv.1e /usr/local/man/man1/imdkcv.1
%

これでimdkcvは/usr/local/binにインストールされることになりますが、OS X標準のpath設定には/usr/local/binは入っていません。ですから(shellとしてtcshを使っているなら).tcshrcファイルか.loginファイルでpath設定に/usr/local/binを(先頭に)追加しておけば便利でしょう。

% echo 'set path =  ( /usr/local/bin $path )' >> .login
%

mccc

ところが、imdkcvなどを使っても濁点や半濁点は正常に表示されません。何故こんなことが起こるのかというと、通常UTF-8というと規格としてUNICODE 2.xを想定していることが多いようですが、Mac OS XではUNICODE 3.1で定義されたUTF-8で、Normalization Formというものを使っているそうで、こんなことになってしまうようです。
それだけではなく、他にもややこしいことになっているようです。

それならいっそのことMac OS XのFoundation Frameworkを使ってコード変換すれば間違いはなかろうということで作ったのがmcccです。

インストールはいたって簡単で、ダウンロードしたら適当な場所で展開(解凍)し、中に入っている"mccc"という名前のファイルをパスの通っている場所に移動/コピーするだけです。

機能としては、標準入力またはファイルから入力された文章(文字コードはUTF-8, UTF-16, EUC-JP, Shift-JIS, JIS(ISO-20222JP)を、指定した文字コードに変換し、標準出力またはファイルに吐き出すことです。ですから、日本語ファイル/フォルダ名を表示したいなら、以下のようになります。

% tar xvfz mccc-0.5.tar.gz
    :
% sudo cp mccc-0.5/mccc /usr/local/bin/
% rehash
% ls -vC | mccc
hogehage.txt    mccc-0.5    なんだこれ.txt    駄目だこりゃ.txt   ...
    :
    :
%

いちいち"ls -vC | mccc"などと、入力するのも面倒だ、という人は、.tcshrcなどに次のようなAliasを登録しておけば良いでしょう。

% echo 'alias lsu "ls -vC \!:1* | mccc"' >> ~/.tcshrc
%

これでlsの代りにlsuを使えば、日本語ファイル名を含めて正しく表示されると思います。

なお、各種の改行コード変換を行うこともできます。また、mcccのソースコードも同梱しておきましたから、物足りない人は適当にいじってもらって構いません。