読者です 読者をやめる 読者になる 読者になる

The 42 Of Spaghetti

メモを交えて所有物を淡々と記録するログ

OS Xのターミナル上でのマルチバイト濁点の取扱いに気をつける

ターミナル上でgrepなんかを使うときに「アジ」とか「カジキ」みたいな濁点があるフォルダが検索できないことの対処法メモです。
こちらのブログの記事が詳しいです。sed・grepで濁点と改行をまともに扱う方法 - ザリガニが見ていた...。

結論:iconvを使用する

ターミナルはUTF-8、OS XはUTF-8-MACと文字コードが違うため(追記:違いません)、文字コードを揃えてやるためにiconvを使います。

フォルダで「カジキ」というフォルダの文字コードはUTF-8-MAC。
lsで問題なく表示されるけどターミナルの設定をUTF-8にしていると(そして多くのひとはそうしていると思います)、文字コード違いが置きます。これはさらに「アカサタナ」みたいに濁らないカタカナは同じ(UTF-8-MACはUTF-8のMAC版方言という感じ)なのでちょっと気づきづらい。てか普段使わないと忘れます。

カレントディレクトリに「カジキ」「アカエイ」があったとして、

ls -1 | grep "アカ"

は"アカエイ"がhitするけど、

ls -1 | grep "カジ"

はhitしない。"ジ"のコートが違うためです。なので、"カ"だけだとhitします。

でも

ls

とすると、terminal上に文字化けなく「アカエイ」「カジキ」が表示されます。

文字コードを変更する

OS X側の文字コードはUTF-8-MAC(追記:違います)、Terminalのツールは基本UTF-8、Terminal上の入力もUTF-8にしているので、ここの違いを吸収させればOKです。とはいえ、terminalをmacに合わせるのは不都合があるので、一時的に文字コードをUTF-8-MACに変換うることにします。このときにiconvを使います。

先ほどの他lsの例だと、

ls -1 | grep `echo "カジキ" | iconv -f UTF-8 -t UTF-8-MAC`

となります。これでカジキがhitします。

対象コマンドはfind / sed / grepなど。そのままで良い物もある

ちなみにこの処理が必要なのは多分正規表現を使えるコマンド群、だと思います。
自分が確認しているものだとfind / sed / grep です。cdはこの処理をしないでも使えます8(移動できる)、当然openもそのままでいけます。

やりたかったこと:カレントフォルダのマルチバイトフォルダを探してひらく

今いるフォルダに(自炊のための)フォルダが結構並んでいて、フォルダ名は当然スペースもあるしマルチバイトが普通。spotlightは相変わらず使えないので、目的のものを一発で開くbashスクリプトを作ったのがきっかけでした。

とりあえず開ければ良いというスクリプトは以下。

#!/bin/bash
ls -1 | grep "`echo "$1" | iconv -f UTF-8 -t UTF-8-MAC`" | awk '{ printf "\"%s\"",$0; }' | xargs open

これ、hitするものが1つ以上あるとエラーになる作りです。
例えば上の「アカエイ」「カジキ」のフォルダが有る場所で実行すると

The file (dirs)/tmp/アカエイカジキ does not exist.

と、フォルダ名がつながった形のエラーがでます。

改良するのは面倒だし、自分の目的に支障はないのでとりあえずコレを使います
※ちなみに単純に操作したいだけならfindの正規表現よりこっちのほうが全然早いです。

追記:これは文字コードではなくてファイルシステムと扱いの問題でした。詳しくは下部にある通り。

qiita.com

なので
UTF-8-MAC なんていう文字コードはありません | ものかの

utf-8-macってのは暫定的にiconvが保持している内部の名前で、そういう文字コードがあるわけではない、という話。

広告を非表示にする