彷徨えるフジワラ

年がら年中さまよってます

Cygwin のパス名符号化が UTF-8 化

Emacs(Meadow) 経由で "hg commit" しようとしたら、何故かエラーで中断される。あれ?何がまずいんだ?

"hg status" してみると、最近全く触った覚えの無いファイルが missing("!") 扱いになっている。おまけに、これまた全く身に覚えの無いファイルが unknown("?") 扱いで表示されている。

よくよく見ると、missing なファイルは日本語ファイル名で、unknown なファイルはファイル名こそ文字化けしているけど、どうも missing なファイルと同じパスっぽい。
missing なファイルは:

  • エクスプローラではちゃんと見える
  • (cp932 でファイル名を扱っている)Meadow からもちゃんと見える
  • Cygwin で ls すると、ファイル名が文字化けする

という状況。

ってーことは、ファイル名の符号化方式が cp932 から変わったってことで良いのかな? ls の出力をファイルにリダイレクトして開いたら、文字コードutf-8 になっていたので、多分これが正解なのだろう。

ウェブの大海を彷徨うことしばし。どうやら Cygwin の 1.7 版からは、locale 対応機能を頑張っているらしく、そのついでにデフォルト設定を UTF-8 にしてくれちゃったらしい。昨日のごたごたで Cygwin を update したのが原因だったのね.... orz

試しに "export LC_CTYPE=ja_JP.cp932" した上で ls すると....おぉ!日本語ファイル名が正しく表示される!

以前から:

Windows のファイル名内部表現形式は既に UTF-16 されているけど、旧来の API が各国固有の符号化方式をベースにしているためにアレな状況になっている

らしいという話は聞いていたので、あるべき姿に進みつつある、ということなのかな?

とりあえず、現状の自分の環境は cp932 を前提に設定しているので、Windows の環境設定で LC_CTYPE 環境変数を ja_JP.cp932 にすることに。すると、"hg status" 様の怒りも静まった模様(笑)。

後は Meadow がファイル操作に unicode ベースな API を使うようになれば(既に使ってる?)、一気に utf-8 化できるなぁ。もっとも、既存のリポジトリに関しては文字コード中立な格納になっていないから、新規作成のものに限定されてしまうけどね > mercurial

そういえば、TortoiseHg のファイル名符号化方式は、エクスプローラとの連携方式に依存する筈だけど、あそこは元々何を使っているのかなぁ? UTF-8 ? CP932@日本語Win ?