カラクリスタ

Cygwinのnl_langinfoをUTF-8にやっつけで対応させる方法

概要: Cygwin の nl_langinfo を UTF-8 にやっつけで対応させる


VMware とか coLinux とかを使ってみてもどうも定着しなくて、Windows と UNIX like system をシームレスに扱いたい! ということで、最近というかしばらく前から Cygwin をいじってるんだけど、

  • UTF-8 Cygwin.dll に入れ替えてexport LANG=ja_JP.UTF-8しても、 Subversion とかで日本語がうまく扱えないので、やっつけで対応させる方法を書いてみる。

まず、どうやってnl_langinfoにたどり着いたかというと、

  1. Cygwin の Subversion で日本語メッセージが文字化けする(Win 版 Subversion でAPR_ICONV_PATHを指定してないときみたいになる)
  2. Google で検索する
  3. Cygwin の Subversion で日本語を表示できるようにしてみる http://www.gainabros.com/2007/12/10/4/ というページを発見する
  4. 文字化けの原因は Subversion が使ってる APR が原因と判明。
  5. さらに調べると、APR が使ってる Cygwin のnl_langinfoがうまく機能してないのが犯人
  6. なら nl_langinfo を修正した cygwin を作れば問題解決できるんじゃね? <-今ココ

という感じ。

で、これをやっつけで修正する方法は、

  1. まず、Cygwin のソースをsetup.exe経由で取得。
  2. で、僕は UTF-8 版 Cygwin.dll を使ってたので、 UTF-8 Cygwin の patch http://www.okisoft.co.jp/esc/cygwin-20.html 取ってきて、patch を適用。
  3. んで、/usr/src/cygwin-1.5.25-15/newlib/libc/locale/nl_langinfo.cの 93 行目、ret = "US-ASCII";となってるところをret = "UTF-8"に変更。
  4. ./configure && make
  5. make が終わったら、./i686-pc-cygwin/winsup/cygwincygwin0.dllcygwin1.dllにリネームして/binにインストール
  6. 以上終了。

という感じ。で、上記の方法で、Subversion の文字化けがバッチリ直りました。 あと、他にも APR 使ってるアプリケーションやnl_langinfoを使ってるアプリケーションでも、 実装にも因るでしょうが、日本語が正しく扱えるようになると思います。

ただ、この方法は環境変数LANGで UTF-8 を指定していない場合には対応していません。まあやっつけだからね。 というより文字コードの判別で、該当する文字コードがなかった場合にUS-ASCII返す代わりにUTF-8を返すようにしているだけなので、 根本的な解決じゃないです。まああのえらい中途半端なnl_langinfo.cが修正されないことにはなんとも。

あ、あと Cygwin を make するときに、Makefilemakeinfoのパスがうまく見つけられなかったようで、 最初コンパイルしようとしたときは、うまくコンパイルできませんでした。 まあMakefileの中のmakeinfoを検索して修正したらあっさり直りましたが。

まあこれで Cygwin の日本語の扱いがマシになったんじゃないかなぁと思います。 他にもzshとかlsの日本語の扱いで面倒な事があったんですが、これはまた別の機会に。 というか別の記事で書くと思います。

まあこれで Cygwin の Subversion で日本語がきちんと扱えるようになったので、 また Cygwin 環境構築の続きができそうです。

#FIXME