rcmdnk's blog
Last update

20191119_macutf3_200_200

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とかは対応していないので、そのまま使うとこれらのファイルは文字化けします。

20191119_macutf1.jpg

ただし、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`

みたいな感じで変換をかましたりしないといけません。

その他の例:

macOS 濁点問題にシェル芸で挑んだ話

問題の確認

実際どういった感じで見れるか、もうちょっと試してみます。

ターミナルで

$ 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でインストール。)

20191119_macutf2.jpg

こんな感じで、ファイルの文字コードをguessしてみると、 ターミナルから作ったファイルはUTF-8なのに対してFinderで作ったファイル名は Shift_JISとなっています。

これは実際Shift_JISになってるわけではなく、UTF-8ではないなにか、みたいな感じになって Shift_JISにしています(だとおもう)。

いずれにしろ、Finderで(半)濁点付きファイルを作ってしまうと ターミナルからは非常に扱いにくくなります。

基本的にアルファベット、数字だけでファイルを作っていれば良いのですが、 Macを日本語で使ってれば日本語ファイル名も出てきますし、 さらに同じファイル名で保存しようとすると...のコピーという半濁音つきの名前に なるので結構存在してたりします。

じゃあどうすればよいか、というのは上にあるような変換を行ったり そういうのを定常的に実行できるようにシェル芸したり。。。

ただ、とりあえずこういったことを覚えておけば対処も出来るかな、ということで。

Windowsでの文字化け問題

Macで保存したファイルをWindowsで開くと文字化けしたりしますが、 WindowsでShift_JISを使ってたりすることによったりするので その辺は今回は省略、以下参照。

Mac で zip 圧縮するときの文字化け対処法

ZIP中のファイル名の文字化け - @tmtms のメモ

[日本語名のファイルを直接アップロード・ダウンロードさせる時の諸問題 ミヤビッチの穴](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年頃)に一度取り入れられてまたはずされる、 といったことがありました。

何故戻したのか経緯はわからないのですが、とりあえず もう一度入れたい場合は戻した経緯を確認してきちんと問題把握した上でやらないとまた弾かれてしまうと思います。

正直中身を全部ちゃんとは理解してない、という点があってすぐにパッチを送ることも出来ない、というのが悪いんですが、 せっかくなのでちゃんと理解してやりたいですね、いつかは。。。

追記ここまで

Sponsored Links
Sponsored Links

« GPGPUは装置名なのか、計算方法名なのか Homebrew(Linuxbrew)でELF: x: Errorが再発 »

}