今まで必要に迫られなかったので使っていなかったネットワーク越し nkf をやってみた。
なんでやってみたかというと、ターミナルのエンコーディングと異なるエンコーディングでデータを抱えている DBMS に繋いで中身を見たら、手元の環境では化けちゃってどうにもならなかったから1。うまくいく場合もあるらしいんですが…。
以前ターミナルを UTF-8 にするときには化けてから考えるし、たぶん screen で吸収できると思ってたんだけど、全然吸収できなかった。
ということで解決のためにとった方法は具体的には図の通りで
- localhost の screen で encoding 変換
- remotehost の screen で encoding 変換
- localhost の nkf -u で encoding 変換
のうち、以前は 1 を意図していたけどこれはダメ。2 か 3 でないと化けちゃうことが分かった。
2 は remote への接続方法が ssh や telnet なら可能だけど、DBMS に繋ぐ場合は使えない。そこで今回は 3 についてのお話になる。
まぁ具体的には
単に nkf -u でしょ?
ということになるんだけど、
入力エンコーディングは指定した方がいいし、rlwrap を組み合わせるとさらに幸せ
なのはあまり見ない話なので書いておく。
nkf の入力エンコーディングは大文字で指定する。例えば EUC-JP が入力されることが分かっているなら -E で、これを UTF-8 に出力したければ -Ew と書く。古いサーバが EUC-JP で動いていて最近の機械はみんな UTF-8 だ、なんて場合は
| nkf -Ew -u
が炸裂しまくります。
もひとつ。これはうちの環境だけかもしれないんだけど、
nkf -u で繋いだらプロンプトやパスワード入力を促すメッセージなどが表示されないよ?
という問題が起きました。もしかすると最後に改行がないメッセージは出力されないのかな? よく分からないけど。で、
rlwrap を組み合わせたら問題なくプロンプトが表示されますた
ということです。最終的には
rlwrap psql -U postgres -h DBHOST DBNAME | nkf -Ew -u
で読むだけなら快適作業ができました。これは ssh や telnet で繋ぐ場合でも同じように使えるので、今度からこれでいこうと思います。長いけど。
なんかしかしやたらと使えるな < rlwrap
※ あれでも日本語の入力はできないな。これはしょうがないのかな?
環境は OSX 10.3 + Terminal.app 1.4.6 + zsh 4.1.1(標準) + screen 4.0.2(Fink). たぶんこの screen 4.0.2 の問題かなという気はするんだけど、いかんせん Fink の screen のバージョンが上がらないもんで。 ↩