universalchardetをCocoaで

Mozillaエンコーディング判別ライブラリをCに切り出したuniversalchardetを、Cocoaフレームワークにしてみた。

1 kB程度あればほぼ確実に判別できるので、NSStringのinitWithContentsOfFile:usedEncoding:error:の代わりに使えそう。

でもやっぱり数文字だとミスは増える。

ASCIIに収まる文字のみで構成されている場合には、1 kB程度あっても判別できていない、というかASCII互換なエンコーディングから適当なエンコーディングを選ぶことができない(Shift_JISとして保存された文章だけどASCII部分しか使われていない、という可能性)。

まぁ実用的には自動判別で読めればいいわけだから、適当に返せばいいのかも。というわけで、initWithContentsOfFile:usedEncoding:error:の代替メソッドを作るなら、

  1. まずinitWithContentsOfFile:usedEncoding:error:で読んでみる。UTF-16、32なら判別可能だし、OS 10.5で保存された文章であればファイルシステムの拡張属性から保存時のエンコーディングを読み取ってくれる。
  2. universalchardetで判別し、判別できたらinitWithContentsOfFile:encoding:error:で読み込む。
  3. 判別できなかったらUS-ASCIIのみで構成されている可能性があるので、NSASCIIStringEncodingとしてinitWithContentsOfFile:encoding:error:で読み込んでみる。
  4. 読み込めなかったら、諦める?

というような流れかな?ただしテキストファイルであるとわかっていることが前提(そうでない場合、当然universalchardetで判別できない)。

ちなみに、NKFでNSDataを拡張するNKFCocoaなるものがあるのか。