Smultronのエンコード自動判定

マックのエディタSmultronはとても気に入っていて長らく愛用しているのですが、文字コードの判定がクロスプラットフォーム(Linux/Win/MAc)で作業する僕にとって不都合が多くて自動判定の部分を修正して使っているのですが、バージョンアップの度毎この修正作業が結構面倒なのが玉に瑕。(しかもこのSmultron、非常にアップデートが頻繁)

久しぶりにチェックしてみたらメジャーバージョンアップの3.0.4がでていたのでお決まりの修正作業を加えようかと思ったのですが、このエンコーディングの判定に関してちょっといい記事藤棚工房別棟 −徒然−: Cocoaで文字エンコーディングの自動判別プログラムを書いてみましたを見つけてこちらは僕のやっている自動判定処理より全然スマートなのでこちらを参考に(っていうかほとんどコピペです。)させて貰いました。

それにしてもなんでCocoaのエンコーディング関数を使うことを思いつかなかったんだろうか?文字コード判定というとすぐ「C言語によるプログラム辞典」(絶版みたいですね)を思い浮かべてしまうのが哀しいです。というわけで、3.0.4ではSMLTextPerformer.m(guessEncodingFromData())の一行目でいきなりNSISOLatin1StringEncodingで変換している部分とその変換結果の文字列が9より大きかったらっていう部分をバッサリコメントアウトして藤棚さんのコードに差し替えました。(BOMの判定だけは残してます)また、藤棚さんのコードではinitWithContentsOfURLが使われていましたがSmultronではinitWithDataに差し替えてます。

NSStringEncoding encodings[] = {
  NSUTF8StringEncoding,
  NSNonLossyASCIIStringEncoding,
  NSShiftJISStringEncoding, 
  NSJapaneseEUCStringEncoding,
  NSMacOSRomanStringEncoding,
  NSWindowsCP1251StringEncoding,
  NSWindowsCP1252StringEncoding,
  NSWindowsCP1253StringEncoding,
  NSWindowsCP1254StringEncoding,
  NSWindowsCP1250StringEncoding,
  NSISOLatin1StringEncoding,
  NSUnicodeStringEncoding, 
  0
};
NSString* try_str ;
int i = 0;
// may be ISO-2022-JP
if (memchr([textData bytes], 0x1b, [textData length]) != NULL) {
  try_str = [[[NSString alloc] initWithData:textData 
    encoding:NSISO2022JPStringEncoding] autorelease];
  if (try_str != nil) 
    return NSISO2022JPStringEncoding;
}
// try to encoding
while(encodings[i] != 0){
  try_str = [[[NSString alloc] initWithData:textData 
    encoding:encodings[i]] autorelease];
  if (try_str != nil) {
    encoding = encodings[i];
    break;
  }
  i++;
}
return encoding;

これまでダメだったISO-2022-JPも取り入れてバッチリ。藤棚さんに感謝!。できれば本体の自動判定機能を強化して欲しいなぁ。ところで、3.x系よりとうとう日本語ローカライズもなくなってしまいました。別段困らないけれど、自分でやろうかなぁ。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/152
ひとりぶろぐ から 土, 2007/11/17 - 01:50 受信

iPod touch / iPhone用テキストエディタMobileTextEd

返信