てめぇが使っておる MSYS で日本語なんか嫌いぢゃ、の今更のメモ

この話を書いたのならこれも気になる、のよ、ずっと説明してないことが気になってたんね。

「多バイト文字列」が悩みのタネであり続けている、てのはまぁ MSYS に限らない話。ただ、こと MSYS に関して特殊な事情があるとするならば、一つ前のでも言ったことだけど、「デベロッパとしてもユーザとしてもあくまでもミニマル」であることこそが正義で、なおかつ、更新頻度は非常に低く、そしてワタシのように10年以上同じバージョンを使い続ける、それが是とされるような、そんな性質を持ったツールセットなのだ、MSYS というのは…、てことね。

ゆえに「MSYS を使い続けよう」とするマインドセットにおいては、「bash にマルチバイト拡張パッチをあてる」みたいな、Unix だけで生活してれば普通に考えるようなことは、まぁまず考えない。実際そういうパッチは過去にあったと記憶してるが、この MinGW プロジェクトにおける bash にそういう措置を施すのはあんまし簡単なことではないし、仮に簡単だとしても、その保守が大変過ぎるわけね、そういうことをしてしまうと「10年使い続ける」ようなものにしづらいわけ。10年後にパッチのありかがわからなくなる、のようなものだと困るわけさね。

てなわけで「コマンドラインに日本語を入力できない bash」を使い続けることになるわけなんだけれど、じゃぁワタシは「日本語フォルダ名」だの「日本語ファイル名」を使わないのか? 無論「んなわきゃない」。普通に日本語をファイル名やフォルダ名に使ってる。昔はかなり避けてたけど、最近になるほど無頓着になってきてるのは、エロ音声のせいだわ。こういう音声の配布は、当然ながら日本語を当たり前に含むけれど、いちいちこれを英語に直してたら身が持たないもの。

じゃぁ、そうやって「エロい音声.zip」を展開した「エロい音声」フォルダに、ワタシはどうやって「cd」してるのか? たとえば、ね。cd が一番最初に問題になるのでね。

一番簡単なのは、「標準入力には普通に MBCS をブチ込める」ことを利用しちゃうことね:
mbintobash
バックティック(`)がコマンドの結果を引用するというイミで、cat コマンドは…わからない人いる? この、おそらく「UNIX コマンドの中で、echo・true・false の次に簡単なプログラム」は、コマンドライン引数に与えられたファイルの中身を「標準出力に垂れ流す」。のだけど、コマンドライン引数が与えられない場合は、「標準入力で与えられた内容を標準出力に垂れ流す」。そういうわけで、「catが入力を標準出力にコピーするので、その「引用」」により、結果として上でやってるのは cd "G:\PSR\Videos\adult\_hypno_commercial\ヒプノポリネシアン~BlueHeaven~ - for Men" としたのと同じってこと。

ただしこのアプローチには限界があるのが問題でな。この「コンソール」てぇやつは、デフォルトでは「cp932」固定なわけね。だけれども、Windows 10 全体としてはファイルシステムには「utf-8」(というかまさに Unicode)が使われているわけで、従って「utf-8 では表現できるが cp932 範囲外」というファイル名・フォルダ名が実現できてしまっているんだけれど、当然ながらこの「cp932 設定のコンソール」が今度はその文字を受け付けない(bashではなくだよ)。これは一応「Chcp コマンド」で変更できることになってはいるんだけれど、まぁやらんほうがいいと思うわ。ガッカリすると思うよ。少なくとも日常使いにするのは難しいと思う。ので、全く別のアプローチも必要なわけね。

てなわけでももう一つの発想は、「既に開いているアプリケーションで「そこでシェルを実行する」」という考え方ね。本当に Windows エクスプローラのシェル拡張を使う手もあって、ワタシは人様が作ったものを使ってたこともあるし、自分で(Visual C++(ATL)で)シェル拡張を書いて使ってたこともある。自分のやつはもうソースコードもおそらく紛失しちゃってるし、見つけたとしてもおそらくもうビルド出来る環境の方を復元出来ないのだけれど、誰かが作ったものは、たぶん今でも頑張って探せば見つかるような気はする。何も「bash そのものが直接起動できる」ことにこだわる必要もなくて、これも使える:

これに類するものはかつてはもちろん「みんな愛してやまない DOMESTOSDOSMESDOS(と呼ばれ続けている哀れな「コンソール」)」が起動していた。Windows 10 からなのかな、とにかく今はこれは PowerShell コンソールが開く。これを経由して bash を起動しちゃえばいい。

あるいは、ワタシは大抵は emacs から起動している。これについては多分前に書いたShellExecuteネタを見てもらったほうがいいかなと思う。直接「bash.exe」を起動したり、リンク先でやってるように「start もしくは ShellExecute」を介したりと、やりたいことによってどちらも使うけれど、どちらの場合でも「開いているそこで bash 実行」出来る。

あとは、そもそもが Unicode やマルチバイト文字を扱うように作られてない「ソフトウェア自身の問題」が起こることはあるが、そういう場合はまぁワタシの場合は、ほぼ十中八九「python に逃げる」。前にまさに、find の例を書いた。アーカイバ系もそうかな、これとかね。これもそうかしら、違うかな、近い話をしてるね。

うん、ずっと説明してこなかったなぁ、と思ってたのはたぶんこれだけ、かなと思う。知らないと相当ストレスがたまるようなことなのでね、言ったほうがいいのかなぁ、とはずっと思ってたのよ。日本語にまつわる厄介事ってのはこれだけには留まらないけれど、ひとまず最小限、ということだと、まずはこれだけでかなり楽になるんではないかと思うよ。(ほかにも思い出したら追記するかもしれんけどね。)