Macの中でGNU screenなどを立ち上げると文字化けすることがありますが、 その辺の問題についてのメモ。
Macでの文字化け問題
Macの中でGNU screenを立ち上げたらファイル名の表示などが文字化けしたりすることがあります。
殆どの場合は日本語ファイル名で濁点を使ってる場合で、文字コードの問題です。
ただ、単純にUTF-8かShift_JISか、とかそういったものではなく、濁点や半濁点の扱いの特殊さによります。
MacではFinderでもターミナル上でも基本的にUTF-8で文字を扱いますが、 UTF-8の中でもいくつか文字の取り扱いに対して違うものが存在します。
FinderではNFD(Normalization Form Canonical Decompression)と呼ばれる方式(の改変版)を使っていて、 この中では濁点や半濁点が文字本体とは別に保存され、それぞれで二文字として扱われます。 これはUTF-8-MACと呼ばれることもあります。
一方、ターミナルなどでは濁点や半濁点がある文字は全体で一文字として扱います。
Terminal上で「ダ」や「パ」が付くファイルを検索できない理由と対策 - 新・OS X ハッキング!(169) マイナビニュース
これにより、Finderで濁点付きのファイルを作って保存した後、
ターミナルでls
とかで見ると文字化けが起こる場合があります。
ただ、Macのターミナルとかはそれ自体がこの問題に対応していて、
普通にls
とかしてもちゃんと化けずに見れます。
一方、この問題に対応していないツールとかだと化けて見えてしまいます。
素のGNU screenとかは対応していないので、そのまま使うとこれらのファイルは文字化けします。
ただし、Macにもともと入っている/usr/bin/screen
はこの問題に対応しているのでこれを立ち上げてみても文字化けはしません。
この問題でややこしいのは、文字化けするようなscreen
を立ち上げてる状態で
$ touch aのコピー.txt
とかいうファイルを作ってみても文字化けはしません。
一方で同じ名前のファイルをFinderで作ってから見ると化けます。
逆にターミナルで作ったものとFinderで作ったものはFinder側からは見分けはつきません。
MacのファイルシステムではNFDのものもそうでないものも同じものとして扱うので
touch
で新たに作ろうとしても作れません。(Finderからも勿論同じ名前はつくれません。)
ですが、例えばfind
コマンドで見つけたりするような場合には区別されるので
NDFなものを探すのは非常に面倒です。
上のリンクにあるように
$ find . -name `echo "オランダ.png" | iconv -f UTF8 -t UTF8-MAC`
みたいな感じで変換をかましたりしないといけません。
その他の例:
問題の確認
実際どういった感じで見れるか、もうちょっと試してみます。
ターミナルで
$ touch aのコピー.txt
として作ったものと、Finderで適当なファイルの名前をaのコピー.txt
という名前に変更したもの(上記とは別のディレクトリで)を
それぞれ、
$ cd /path/to/touch_file/dir
$ ls > a.txt
$ cd /path/to/finder_file/dir
$ ls > b.txt
みたいにしてファイルに保存しておきます。
これらのファイルを両方持ってきてnkf
コマンドで文字コードを見てみます。
(brew install nkf
でインストール。)
こんな感じで、ファイルの文字コードをguessしてみると、 ターミナルから作ったファイルはUTF-8なのに対してFinderで作ったファイル名は Shift_JISとなっています。
これは実際Shift_JISになってるわけではなく、UTF-8ではないなにか、みたいな感じになって Shift_JISにしています(だとおもう)。
いずれにしろ、Finderで(半)濁点付きファイルを作ってしまうと ターミナルからは非常に扱いにくくなります。
基本的にアルファベット、数字だけでファイルを作っていれば良いのですが、
Macを日本語で使ってれば日本語ファイル名も出てきますし、
さらに同じファイル名で保存しようとすると...のコピー
という半濁音つきの名前に
なるので結構存在してたりします。
じゃあどうすればよいか、というのは上にあるような変換を行ったり そういうのを定常的に実行できるようにシェル芸したり。。。
ただ、とりあえずこういったことを覚えておけば対処も出来るかな、ということで。
Windowsでの文字化け問題
Macで保存したファイルをWindowsで開くと文字化けしたりしますが、 WindowsでShift_JISを使ってたりすることによったりするので その辺は今回は省略、以下参照。
[日本語名のファイルを直接アップロード・ダウンロードさせる時の諸問題 ミヤビッチの穴](https://hole.sugutsukaeru.jp/archives/723)
HomebrewでインストールするGNU screenの文字化け対策
MacにインストールされているGNU screenはちゃんと対策がされているのですが、 古いのと256色が使えなかったりするので ちゃんと使いたい人はHomebrewとかでインストールしていると思います。
ただ、そのままだと上の文字化け問題が起こります。
なのでこれの対策版用のFormulaを作って使っていました。
で、この前4.7.0が出たとき、パッチをそのまま当てたらエラーになったので、 ちょっと面倒だったのとパット見問題なさそうだったのでこのFormulaをアップデートせずに Homebrew-coreにあるデフォルトのものを使ってました。
が、やっぱりだめだったのでアップデートして対策版をインストールすることにしました。
homebrew-rcmdnkpac/screenutf8.rb at master · rcmdnk/homebrew-rcmdnkpac
パッチの内容に関して、正直なところ内容をきちんと把握してなくて、 4.7.0でも動作するように変更しただけなのでもしかしたら問題が起こるかもしれませんが、 今の所問題なく動いていて、 上記の文字化け問題もクリアできています。
$ brew rm screen # if you have already installed screen
$ brew install rcmdnk/rcmdnkpac/screenutf8
という感じでインストール出来ます。
追記: 2019/11/20
はてなブックマークで
knok screenのupstreamは今アクティブなのでパッチをちゃんと投げてあげてほしい
というコメントがあったのですが、 このパッチは実は以前(2014年頃)に一度取り入れられてまたはずされる、 といったことがありました。
何故戻したのか経緯はわからないのですが、とりあえず もう一度入れたい場合は戻した経緯を確認してきちんと問題把握した上でやらないとまた弾かれてしまうと思います。
正直中身を全部ちゃんとは理解してない、という点があってすぐにパッチを送ることも出来ない、というのが悪いんですが、 せっかくなのでちゃんと理解してやりたいですね、いつかは。。。
追記ここまで