- コマンドラインで日本語を - on Mac OS X 3(3)/12699 更新:2013/05/19

←ホームページ

vimとnvi-m17nのページへ→


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

Termnalと日本語文字コード変換

Mac OS Xにはコマンドを打ち込んで様々な操作を行うための"Terminal"というアプリケーションが入っています。(/Applications/Utilities内) Terminalでは現在(Mac OS X 10.3.*)、日本語入力・表示ができるようになっています。しかし、バックスペースの動作がちょっとおかしかったり(漢字半分だけカーソルが戻るとか)、文字化けしたりする(特に日本語文字コードをEUCにしていると)ことがまだあります。

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

JTerminal

まず、Terminalの代りにKusamaさんのJTerminal(*1)を使うことによって日本語(EUC)表示・入力ができるようになります。
(*1):iTermというソフトでも日本語表示・入力できますが、ちょっとした理由(ssh-agent配下で動かせる)で私はJTerminalを使っています。

実は、JTerminal自体は日本語入力に対応しており、OS X (10.3.*)にデフォールトで設定されているShellのbashも日本語を通すのですが、わけあって私が使用しているtcshはそのままでは日本語表示・入力ができないのです(;_;) このあたりの対処法などはbashとtcshのページで書くことにします。

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

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

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

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

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

ところで、JTerminalが扱えるのは日本語EUCだけです。OS Xが扱うファイル名はUTF-8で表現されていますから、lsコマンドなどを使って、日本語ファイル名を表示させようとしてもそのままではうまく行きません。こんなときは、日本語文字コード変換ソフトを使ってUTF-8からEUCへの変換が必要になってきます。

コマンドラインから使用できる文字コード変換ソフトとしては、有名なnkfというのがあります。nkfを用いれば例えば以下のように日本語ファイル名を表示することができます。

% ls -vC | nkf -W -e
hogehage.txt    なんた゛これ.txt    駄目た゛こりゃ.txt   ...
    :
    :
%

...と、思ったのですが、上記の通り、濁点/半濁点が2つの文字に分解([だ]が[た]と[゛]のように)されて表示されてしまいます。しかたがないので、mcccというOS X専用の日本語文字コード変換ソフトを作ってしまいました。これについては後ほど書くことにして、その前に...

nkf

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

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

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

% mkdir NKF
% ./nkf203.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
%

mccc

ところが、nkfを使っても濁点や半濁点は分割して表示されてしまいます。何故こんなことが起こるのかというと、通常UTF-8というと規格としてUNICODE 2.xを想定していることが多いようですが、Mac OS XではUNICODE 3.1で定義されたUTF-8で、Normalization Formというものを使っているそうで、こんなことになってしまうようです。(詳しくないのであまり突っ込まないように^_^;)
それだけではなく、例えばファイル名のような短いUTF-8の文字列は自動認識に失敗しやすいことなどもあるようです。

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

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

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

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

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

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

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

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