w3m、vim、screen、rxvt、opensshは必要。これらのうち、rxvt以外は最新版をインストールしてもよさそう。rxvtだけはcygwin JEの物を使う。
[setup.exe] ネットワークインストールプログラムのダウンロードから導入まで
http://www.cygwin.com/から最新のsetup.exeをダウンロードする。で、起動。パッケージを選択する前に、パッケージを配布しているサイトを選択するところがある。そこに、http://cygwin-je.sourceforge.jpを追加して、これとこれ以外のどれか1つたとえばhttp://ftp.jaist.ac.jpをCtrlキーを押しながら選択して、次に進む。パッケージ選択場面では最低限のパッケージが選択されているので、極力余分な事はしない。でも、rxvtだけは導入しておく。ただし、最新版ではなくパッケージ名にjが入ったものを選択しておく。
[vim]
.bashrcに次の内容を追加するか、コメントアウトされていたならコメントアウトを外す
export LANG=ja_JP.SJIS export TZ=JST-9 export JLESSCHARSET=japanese-sjis alias ls='ls --show-control-chars'
.inputrcに次の内容を追加するか、コメントアウトされていたならコメントアウトを外す
set meta-flag on set convert-meta off set output-meta on set kanji-code sjis
.vimrcに次の内容を追加するか、コメントアウトされていたならコメントアウトを外す
set encoding=japan set fileencodings=iso-2002-jp,utf-8,euc-jp,cp932
[w3m]
特にしたことは無かったと思う。
[rxvt]
次のようにして起動、とここまで書いて気づいた。こぴぺできねぇ。だめじゃん。ということで中途半端に終了。やっぱりputtyでSSHで家サーバに行った方が早いということに気づいてしまった。ガーン。
とおもったらできた。Shift+Insで出来た。ついでに続きをコピペしておこう。起動は下のような感じ。
C:\cygwin\bin\rxvt.exe -fg white -bg black -fn msgothic-16 -fm msgothic-16 -km sjis -e ./bash.exe --login -i
[ssh] VineSSHサーバにつなぎにいくと文字化け
前提として、クライアント側の設定をメモっておこう。CygwinのOpenSSH、Cygwin JEのrxvtを使った。まずは文字化けを気にしないでVineにつなぎにいく。
hoge@cygwin$ ssh hage@vine
認証が終わって、プロンプトが表示されたらSSHサーバが送ってくる文字のコードを確認する。
hage@vine$ env | grep LANG
出力の結果を見て、eucJPだとわかる。サーバの送ってくる文字をクライアントが受け取って、クライアントが画面に表示するまでに、正しく文字コードの認識が行われないことで、文字化けが起きる。LANGの確認が終わったらログアウトしておく。
hage@vine$ exit
クライアント側の設定を行う。クライアントはサーバからデータを受け取るが、データを区別して受け取るわけではない。あくまで、人間様が表示された内容を見て、これは「あ」で、これは「い」だと区別しているわけだ。だから、受け取ったデータの文字コードを正しく判別してデータを正しい文字コードで表示しなければいけない。
いま、サーバが送り出すデータの文字コードがわかったので、つぎはクライアントが受け取ったデータを表示する文字コードの確認を行う。この2つの文字コードが異なっていると文字化けする。
hoge@cygwin$ env | grep LANG
今度は、SJISだった。SSHサーバがSSHクライアントに送り出すデータの文字コードと(SSHクライアントが仮想ターミナルに送り出すデータ、この間に文字コード変換は行われない)、仮想ターミナルが人間に送り出すデータの文字コードが違っていたため、文字化けが起きたことになる。
どこかの過程で、正しく文字コードの変換を行うか、送出側の文字コードをSJISにするか、表示側の文字コードをEUCJPにするか、すればOKである。ここでは、文字コードの変換をおこなうことにする。その理由は、送出側の文字コードや表示側の文字コードを変えることは、たとえば、新規作成ファイルの文字コードを変えてしまったり、日本語ファイルのファイル名の文字コードを変えてしまったり、する可能性があるからだ。
では接続してみようと思う
hoge@cygwin$ ssh hage@vine | nkf --sjis -u
こうすることで、SSHクライアントは受け取ったデータを仮想ターミナルに渡す前に、nkfに渡す。nkfは受け取ったデータの文字コードをsjisに変換して仮想ターミナルに渡すので、仮想ターミナルは受け取ったデータをsjisと思って表示し、人間はこれを理解できる。こいういう寸法だ。
+------------+ | SSH Server |-----+ +------------+ | +-------------------+ | euc decoded data | +-------------------+ | +------------------|-------+ | | | | +-----------+ | | SSH Criant | Do nothig | | | +-----------+ | | | | +------------------|-------+ | +-------------------+ | euc decoded data | +-------------------+ | +------------------|-------+ | | | | +-----------+ | | nkf | Convert | | | | euc->sjis | | | +-----------+ | | | | +------------------|-------+ | +-------------------+ | sjis decoded data | +-------------------+ | +------------------|-------+ | | | | +-----------+ | | Terminal | Translate | | | | data->font| | | +-----------+ | | | | +------------------|-------+ | +-------------------------+ | Human recognizable font | +-------------------------+ | +------------+ | | Human |-----+ +------------+