2005-07-25

FileMerge.app でテキストエンコーディング自動判別

post : 2005-07-25 6:12 , mod : 2005-07-26 16:36 | ,

Developer Tools に付属する FileMerge.app はテキストファイルの日本語対応が駄目で、Shift JIS しか扱えない。改善するぞ。

Preferences... で拡張子ごとに Filter を設定できるようになっている。エンコーディングを判別して変換するスクリプトを書いてテキストファイルの Filter に設定すれば良さそうだ。php で以下のようなスクリプトを書いた(うちは entropy のパッケージ を入れているので、php のパスは「/usr/local/php5/bin/php」とした)。

#!/usr/bin/php
<?php
    $body=file_get_contents($argv[1]);
    //改行コードもついでに変換
    $body = str_replace("¥r¥n", "¥n", $body);
    $body = str_replace("¥r", "¥n", $body);
    echo mb_convert_encoding($body,"sjis","auto");
?>

適当な場所に保存してパーミッションを 755 にしておく。FileMerge の Filter 設定を新規に追加し「Display」は「Filtered」、「Apply」はよく分からないので「No」に。「Filter」は「/path/to/script $(FILE)」という風にする。必要な拡張子の数だけ同じ設定を増やす。これで見事に自動判別されるようになる。ちなみに追加の仕方は、最後の1行が常に空白になっているのでそこに記入していく。

追記:
nkf を入れている人ならわざわざスクリプトを書くまでもないなというわけで、入れてなかったので入れてみた。どこが本家なのかよく分からんがとりあえず sourceforge.jp に nkf というプロジェクトがあった のでここから 2.0.5 のソースを落とす。make 一発でビルド完了。「nkf --help」でヘルプを見ると UTF-8 も扱えるみたいだ。/usr 以下はあまりいじりたくないので ~/usr/bin にコピー。FileMerge の「Filter」は、
/path/to/nkf -sLu $(FILE)
とした。「s」は Shift JIS に変換、「Lu」は改行コードを LF に変換するという意味。結果これもばっちり成功。

5 Trackbacks 現在、受付は中止しています

FileMergeの日本語対応化方法

ヘチマ_BLOG : FileMerge.app でテキストエンコーディング自動判別 ヘチマさん相変わらずすばらしい! Apple純正DiffツールであるFileMergeですが、 日本語エンコードはSJISしか使えず、それ以外だ

From : Drift Diary5 @ 2005-07-26 09:21:09

FileMerge.appでいろいろなエンコーディングを扱う

ヘチマさんの「FileMerge.appでテキストエンコーディング自動判別」という記事を読んで、早速やってみました。FileMerge.appが使い勝手がいまいちに感じて最近使っていなかったのですが、久しぶりに使ってみたらいい感じです。diffなんて使ってる場合じゃないですよ!

From : Travellers Tale @ 2005-07-27 00:51:02

日本語交じりを FileMerge

遅くなっちゃったけど、自分のためのメモ。 ヘチマ_BLOG さんの「FileMerge.app でテキストエンコーディング自動判別」、いいです。 わたしは「FileMerge.app は日本語交じ...

From : AYNiMac @ 2005-07-27 13:12:05

FileMergeで日本語を含むコードの差分をとる

Dveloper Toolsに付属するFileMergeは,2つのファイルの差分を表示するdiffというコマンドをGUIのラッパでくるんだようなものです。 2つのテキストファイルをドラッグ&ドロップするだけでファイルの比較が行えるので,プログラマならずともテキストファイルの比較をしたいと

From : 藤棚工房別棟 −徒然− @ 2006-01-30 21:05:18

ありましたよ、身近に。OSXでテキストの差分表示アプリケーション

ヘチマ_BLOG : FileMerge.app でテキストエンコーディング自...

From : MJ:Blog@majima.net @ 2006-05-10 18:33:09

4 Comments

Re:

GUIのdiffツールでめぼしいものがなかったので、重宝していますが、
言語環境が英語優先の場合、上記のフィルターを通しても正しく認識されないようです。
OS Xにはほかにも(iTunesとかも未だに)言語環境によって自動判別がうまく動かないケースが多々ありますが…なんとかできないものでしょうか…

From : sf @ 2005-11-17 10:52:37 編集

Test, just b test

Hello!
d6ebefb0f18997eafe263f15704c9fb924
And Bye!

From : ttestermanes @ 2005-11-18 01:46:35 編集

Re: FileMerge.app でテキストエンコーディング自動判別

へちまさんありがとうざいます。どこかに変数があるはずと思い続けて、
ずっとわからなかった、まさに知りたかった情報でした。
大変参考になりました。

From : sf @ 2005-11-26 18:48:07 編集

Re: FileMerge.app でテキストエンコーディング自動判別

Mac OS X 上のファイルは内容が日本語でもエンコーディングが SJIS で
なく Unicode (でなおかつ Unicode にしかない文字を使っている)
な場合があるので、最終的には FileMerge がちゃんと Unicode (UTF-8)
対応しないと不便ですねえ。

特に、今のやつだと一行内でテキストの差分があったときASCII以外だと
差分がうまくハイライトされないですよね。
推測するに、内部的には ASCII エンコーディングを仮定して
「差分のバイト長 = 文字の差分長」みたいなコードになっているんで
しょう。
これを「エンコーディングを考慮しつつ、差分のバイト長からテキストの
差分を計算」するか「エンコーディングを考慮しつつ NSString に
読み込んでからテキストの差分を計算」するみたいなコードにする
必要があるんでしょうなあ。
実装するなら前者と後者、どっちがいいんだろ。

From : 戸織須賀利 @ 2006-03-21 00:11:34 編集