日本語コードの自動判別機能

UTF8で閉じたJavaは良いけれど,C/C++文字コードは統一が難しい.

ファイルをオープンしたときに自動的に判別してくれるのがベストだけれども,それは難しいっぽい.
同僚が紹介しているようなプラグインの採用は一つの手だけれども,手元で文字コードをあれこれ変えてしまうと,構成管理上いろいろと問題が出たりする.


たぶん,右クリックメニューで文字コードを自動設定してくれる,って辺りがEclipse 3.2系現在の落としどころだと思う.
下記は,そんな方針でアレコレ探ったメモ.

ScopedPreferenceStoreでの設定方法.

各ファイルの文字コードの情報は,プロジェクトごとに管理されている.そこで,ScopedPreferenceStore へのアクセスがまず思いつく.

ScopedPreferenceStore store =
  new ScopedPreferenceStore(new ProjectScope(project), "org.eclipse.core.resources/encoding");

鍵は,第2引数.巷の解説ページだと,PluginIDとしているページが多い.けれども,スラッシュで区切ることによって,プロパティにプレフィックスを与えられる.これに気づかずに,

store.setValue("encoding/" + resource.getProjectRelativePath().toString(), charset);

なんてやると上手くいかない.どう上手くいかないのかは,試せばすぐに判るので割愛.

IEncodingSupport

上記のように ScopedPreferenceStore を使うと,上手くいく.…ように見えて,実は上手くいかない.確かに .settings/org.eclipse.core.resources.prefs には書かれるのだが,開いているエディタの表示が更新されない.閉じて開き直せばよい…と開き直るわけには,さすがにいかない.ScopedPreferenceStoreを使う案は,今回は却下.


却下に至る前に,refresh()を呼び出すべく Viewer を引きずり出そうと四苦八苦した…のだけれども,無駄な努力だったらしい.
IEditorPart が手元にあれば, IEncodingSupport というイカニモな名称のインタフェースを引きずり出せる.

String charset = "EUC-JP";
IEncodingSupport encodingSupport = (IEncodingSupport)targetEditor.getAdapter(IEncodingSupport.class);
encodingSupport.setEncoding(charset);

とかいう感じ.エディタコントリビューションのコードを書こうという人なら,IEditorPartの入手方法は当然知っているはずなので省略.


setEncoding() は,PreferenceStore の面倒も内部で見てくれる.ぶらぼー.

charset取得機能

a = new String(bytes, "JISAutoDetect");
b = new String(bytes, charset);

で a.equals(b) となる charsetを探すというのが楽.
ただまあ,経験上 JISAutoDetect は結構誤変換*1するので,もうちょっと気合いを入れて判別をしてもよいかもしれない.