日本語の表示と入力

さくらインターネットのレンタルサーバにリモートログイン(シェルログイン)し、日本語入力をするためのテキストエディタについての記事です。

あると便利なソフトウェアの記事で、SSH接続クライアントソフトウェアにPuTTYjpを紹介しました。
ここでも、そのPuTTYjpを使用しています。

毎回WinSCPなどのFTPソフトで、一旦ローカルPC上でファイルを編集した後にサーバへアップロードしている人には、特に関係ないかもしれませんが、FreeBSDなどUNIX系の操作に慣れている人であれば、サーバにリモートログインして、直接ファイルの編集やその他作業をすることもあると思います。

さくらインターネットのレンタルサーバには、テキストエディタとしてvi やview(viのリードモードで起動)、emacs、nvi、elvis、jvim、jvim3などがあります。このうち、日本語に対応しているのは、nvi、elvis、jvimとjvim3です。

viは、テキストエディタのedとその後できたexの派生したエディタです。何がいいかというと、edはすべてのUNIXで使用できますのでviの操作を覚えれば、最悪な状況下でもとりあえずedは操作することができるからです。
そのためemacs系の操作は全くわかりません。便利そうなのですが・・・

現在は、viやemacsの派生版が多数あります。お互いのいいところを移植したり、ハイライト表示などでグラフィカルにしたり、日本語に対応したり・・・
Linuxのディストリビューションによっては、viと入力すれば、グラフィカルな日本語に対応した派生版のエディタが起動するようになっているケースもありますので、viってそれがあたりまえだと思っている人も少なくないでしょう。

日本語入力には日本語変換サーバとクライアントが必要で、cannnaやWnnが変換サーバとして良く使われ、クライアントではuum、canuum、kinput2があり特にkinput2が有名です。ただ、kinput2はXクライアントになりますので、X-Windowシステム上でしか動作しません。
Windowsの場合は、1つの日本語入力システムとして機能しているのでサーバとクライアントと分けて考える必要はありません。

UNIXローカル上で日本語を入力するには、上記の様に日本語変換サーバとクライアントが必要になりますが、Windowsからリモート接続で利用しているので、日本語入力はWindowsのものすなわち、Microsoft IME を使用することになります。

viやviewでは、日本語を入力すると日本語の箇所が文字化けします。
これは、端末エミュレータがUTF8に対応していないとか環境変数がどうとかという問題ではなく、viは日本語に対応していないので当然の結果です。

そこで日本語に対応したjvimまたはjvim3を使用します。
(jvimやjvim3はviクローンのエディタであるvimを日本語対応にしたエディタですので、viと同じように操作できます。)
しかし、デフォルトのままでは文字コードをUTF8にした場合に文字化けしてしまいます。
本来、jvimとjvim3は日本語文字コードの自動判別機能があるので、デフォルトのままでも文字化けは発生しないはずですが、どうも自動識別がうまくいっていないようです。

文字化けしてしまっていたので、さくらインターネットのレンタルサーバを利用されている方々がどうされているかを検索してみましたが、UTF8に対応していないjvimが導入されているという判断をされていて、別途vimやjvimをソースからコンパイルして導入されている方もいました。
私もソースからコンパイルしようかと覚悟を決めていたのですが、jcodeとjmaskでなんとかできるのでは?と思いいろいろと試してみた結果、文字化けしない設定が見つかりました。
2001年ごろのjvimのドキュメントにも、Unicode、UTF8に対応していると記載がありましたので、この使い方でよいのだろうと思っています。

文字化けを起こさないための設定を以下に記載します。

1.サーバにリモートログインするために、PuTTYjpを起動します。

※ログインの設定などは事前に済ませているとして、ここでは割愛します。
※文字コード変換はUTF-8にしておいてください。これはDrupalで使用している日本語の文字コードがUTF-8だからです。

2.ユーザ環境変数の設定

※この設定をするとログイン時の文字コードがUTF8になってしまいます。
この設定自体は文字化けしないようにするための必須の設定ではありませんので、都合が悪い場合は3番にすすんでください。
※ここではCシェルを使用していると仮定して説明します。
ホームディレクトリ直下にある.cshrcファイルに以下を追記してください。

setenv LANG ja_JP.UTF-8
setenv EDITOR jvim3 
alias vi jvim3
alias view jvim3 -v

※デフォルトではLANG変数はC(英語)です。これをUTF-8に変更しています。ja_JP.UTF-8がUTF8の文字セット名になります。
※システムで使用可能なロケールは、locale -aコマンドで確認できますが数が多いので、locale -a | grep ja などとすれば日本語のロケールだけ表示できます。
※現在のロケール設定は、localeコマンド(オプションなし)で確認できます。
※3行目以降で、jvimをviの代替になるよう設定しています。この設定でviを起動したい場合は、\vi と入力すればaliasを無視できます。

3.jvim3の文字コード設定

jvim3自体は、EUC・JIS・SJIS・Unicode・UTF8などの文字コード自動判別に対応していますが、UTF8の判別がどうもうまくいきません。
そこで、ファイルがUTF8であることをjvim3に明示的に伝えます。
方法としては、①環境設定ファイルを使用する方法、②コマンドオプションを使用する方法、③ファイルをオープンしたあとにset コマンドで毎回設定する方法があります。
①は、jvimのデフォルト設定を変更できます。②と③はウィンドウごとに設定を変更できます。
優先順位は、①、②、③の順番です。LANG変数の値は優先順位が最も低くなりますので、2番のユーザ環境変数の設定作業が必須ではないというのはそういう理由からです。
ホームディレクトリ直下に.jvimrcを作成し、以下の内容を入力します。

set jcode=t
set jmask=TTT

※1行目は表示と入力に関係するようです。コマンドオプションでいう-k tと同等になります。
※2行目は主に入力に関係するようです。順番に、「キー入力」「ディスプレイ表示」「システムコード」で、それぞれの文字コードを指定しています。コマンドオプションでいう-K TTTと同等です。
※それぞれの設定値は、文字コードを示しています。
E/e:EUC、J/j:JIS、S/s:S-JIS、U/u:Unicode、T/t:UTF8
・jcodeの値が大文字の場合は、ファイル読み込み時に日本語文字コードの自動判定を行い、小文字の場合は行いません。
・jmaskで設定できるのは大文字だけです。
※今回、jvim3がUTF8、PuTTYjpの端末はUTF8、LANG変数がUTF8なのでTTTとなります。
・最低限、jcodeと「キー入力」だけはUTF8にしておいて、その他は現状の環境にあわるように指定すれば、UTF8の日本語を含むファイルが作成でき、かつ表示で文字化けは起こらないはずです。
・例えばPuTTYjpの文字コードがEUCに設定されている場合は、jcodeはtまたはTで、jmaskはTEXになります。XはEJSUTなんでも構わないようです。
※日本語文字入力時に「キー入力」の文字コードとjcodeの文字コードとが異なっていると、文字化けしたデータのまま「キー入力」で設定した文字コードで保存されますので、表示の際に文字コードを正しく設定しても読めない文字列になってしまいます。
※表示だけの場合は、そのファイルの文字コードとjcodeの文字コード、jmaskの「ディスプレイ表示」の文字コードとPuTTYjpの文字コードが一致していれば文字化けはおきません。

.jvimrcファイルについて

環境設定ファイルに記載するのが抵抗がある場合は、-K TTT -k t オプションで起動するよう、エイリアスに設定すれば良いと思います。
環境設定ファイルはjvimとjvim3共通ですので、起動した際のその他オプションのデフォルト値を変更したい場合は、このファイルに指定しておけば便利です。たとえば、set numberと設定すれば、行番号を表示してくれます。その他のオプションはjvimを起動して、exモード(:を入力)でset allで表示できます
viの場合も同じく環境設定ファイル(.exrc)が使用できます。その他オプションをviとjvimで同じ設定にしておけば、違和感なく使用できると思います。

補足

jvimとjvim3以外の日本語表示に対応したコマンドを利用する場合は、LANG変数とPuTTYjpの文字コードを対象のファイルの文字コードにあわせて正しく設定しないと文字化けします。
たとえば、catやmoreやjlessなどです。
ただ、jlessはUTF8のコンバートに失敗したといったエラーが表示されるので現在は使えていません。
また、時間のあるときにでも調査しておきますが、catやmoreが使用できるので特に急ぐ必要はないかと思っています。

FTPクライアントにWinSCPを使っていれば、リモート側のファイルの編集はWinSCPから可能です。このとき使用するテキストエディタは、デフォルトではWinSCP付属のものになりますが、自分が使っているものに変更できます。サーバ上のテキストエディタを使用しているわけではありませんので、上記のような設定は不要です。
画面上では、リモート側のファイルを直接編集しているかのように錯覚するかもしれませんが、これは一旦、ローカルPCにファイル転送してテキストエディタを起動し、編集が終わればそのファイルをリモート側に転送するといった一連の作業を行っています。そのため、最後にリモート側へファイルを転送する際、上書き確認用のポップアップメッセージがでたり、あたらしいセッション用のパスワード入力画面が表示される場合がありますが、最後まで行わないと変更が反映されませんので注意してください。