カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

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で日本語を表示できるようにしてみるというページを発見する
  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取ってきて、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環境構築の続きができそうです。