Warning: count(): Parameter must be an array or an object that implements Countable in /home/asaki/www/wordpress/wp-includes/post-template.php on line 275

Warning: count(): Parameter must be an array or an object that implements Countable in /home/asaki/www/wordpress/wp-includes/post-template.php on line 275

Warning: count(): Parameter must be an array or an object that implements Countable in /home/asaki/www/wordpress/wp-includes/post-template.php on line 275

Warning: count(): Parameter must be an array or an object that implements Countable in /home/asaki/www/wordpress/wp-includes/post-template.php on line 275

Warning: count(): Parameter must be an array or an object that implements Countable in /home/asaki/www/wordpress/wp-includes/post-template.php on line 275
2月 052004
 

ここのところ、まとまった時間がとれないので、コーディングを行なうかどうかは別としてもKateのファイルの文字コード自動認識の実現に向けての検討を行なってみることにした。
コードベースはとりあえず、KDE_3_2_BRANCHで検討を行なうが、最終的にはHEADへのcommitになるだろう。
自動認識を行なう対象文字コードはUTF-8, EUC-JP, Shift_JIS, ISO-2022-JPの日本語関連のみとする。
Kate自体には現在のエンコードがデフォルトのままなのか、指定されたものなのかの区別をするためのコードは実装されていないため、それらやUIについての懸念材料はあるが、それはあと回しにする。
また、変更の方針としては以下の項目を考慮する。

  • できるだけコードの変更箇所は小さくまとめる。
  • ファイルからの読み込みは一度で済ませる方が良い。
  • 他のアプリにも適用できないかも考慮。


上記の方針を元に、変更対象を決定する。
1. Kate
Kateでファイル読み込みを実際に行なっているのはbool KateBuffer::openFile (const QString &m_file)である。ここでQTextStreamにcodecをセットして、ファイルからデータを読み込んでいる。
自動認識を行なうには、QTextStreamにcodecをセットする前に、ファイルのエンコーディングを確認すれば良い。
ただし、この手法ではファイルを2度走査する必要がある。必要なだけデータをチェックできるため、認識の精度は十分に確保できるが、パフォーマンス的な面でもう一つである。
2. QTextStream
では、QTextStreamで自動認識をするようにできないか。QTextStreamはエンコーディングを指定するメソッド(setEncoding)があるため、利用するコードはスマートでわかりやすいものとなるためいい手法だと思えるが、QTextStream自体のクラス定義を確認すると良くわかるのだが、QTextStreamは派生を考慮して作成されていない。そのため、自動認識が可能で、かつQTextStream互換なクラスを新たに作成する必要があり、コーディング、メンテ等の手間を考慮するとわりに合わない。
このあたりがC++の問題点でもあるか。
3. QIODevice
QTextStreamではQFileなどを内部でQIODeviceとして扱っている。このため、QIODeviceでデータの先読みを行ないつつ、コーデックの認識を行なえば、自動認識を実現できるはずである。ただし、QTextStreamが必須なのはともかくとして、QIODeviceの利用方法が繁雑になる可能性が高い。
コーディング自体には興味があったが、そこまで深い層を利用しないと自動認識ができないというのがネックとなり、あと一歩踏み出せず。
4. QTextCodec
基本に戻るとなると、ここか。いろいろと設計が難しそうで手を出していなかったがQEucJpCodecを参考に眺めてみる。意外と実装しているクラスが少なく、思ったよりも簡単そうだ。というわけでちょっと実装してみるが、思ったようにはうまく動作しない。よくよく確認してみると、ほとんどのメソッドがconstメソッドなのか。
自動認識の結果をどこかにとっておく必要があることを考えると、constメソッドで自動認識はほぼ無理に思えるのだが……。もうちょっと良く考えてみよう。


Warning: count(): Parameter must be an array or an object that implements Countable in /home/asaki/www/wordpress/wp-includes/class-wp-comment-query.php on line 405

コメントを残す