2007-11-27

ネットワーク越しに nkf を使うときは rlwrap もあると便利

今まで必要に迫られなかったので使っていなかったネットワーク越し nkf をやってみた。

ネットワーク越しの文字コード変換の方法と場所

なんでやってみたかというと、ターミナルのエンコーディングと異なるエンコーディングでデータを抱えている DBMS に繋いで中身を見たら、手元の環境では化けちゃってどうにもならなかったから1うまくいく場合もあるらしいんですが…。

以前ターミナルを UTF-8 にするときには化けてから考えるし、たぶん screen で吸収できると思ってたんだけど、全然吸収できなかった。

ということで解決のためにとった方法は具体的には図の通りで

  1. localhost の screen で encoding 変換
  2. remotehost の screen で encoding 変換
  3. 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

※ あれでも日本語の入力はできないな。これはしょうがないのかな?

  1. 環境は OSX 10.3 + Terminal.app 1.4.6 + zsh 4.1.1(標準) + screen 4.0.2(Fink). たぶんこの screen 4.0.2 の問題かなという気はするんだけど、いかんせん Fink の screen のバージョンが上がらないもんで。 

About

例によって個人のなんちゃらです