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月 082004
 

先日書いたKateの自動認識に向けてで少し書いていたが、日本語の文字コードを自動認識するCodecの開発を検討していた。
認識のアルゴリズムについてはkzk氏の日記で紹介されていたguess_jp()をベースに若干の修正を行なったものを用いる。


認識部のアルゴリズムについては精度も良い、使い勝手のいいものがあったため良かったのだが、実装の上で問題となったのがQTextCodecのメンバ関数はほとんどがconstメソッドであること。QTextCodec::toUnicode()の内部で認識を行なっても、それをCodecの内部に記憶できない。
一度はあきらめかけたものの、内部で変更できないなら外部から変更してやればよいと思いつき、japaneseCodecManagerクラスを導入。そちらを経由して変更を行なうことで対処した。少々卑怯な方法ではあるが、やむを得ない。
若干のテストの結果、動作に問題がないようなのでα版として公開しておく。テストに用いていたサンプルコード込みである。実際の利用時にはqautojpcodec.cppとdetectjapanese.cppをリンクして利用してください。
なお、まだDecoderの動作の方針などをつめていないため、参考バージョンとしてみておいていただきたい。なお、guess_jp()由来のdetecojapanese.cppは修正BSDライセンスだが、QAutoJpCodec自体のライセンスは検討中である。QPL/GPLか修正BSDのどちらかで行く予定。
動作内容についてざっと説明しておくと、文字コード判別前はlocale-codecとして振舞う。toUnicode()で渡された文字列を判別した後は、その内容にふさわしいcodecとなる。一度文字コードを認識した後は現状では文字コードを変更する手段は持たない。このため、通常の他のQTextCodec派生クラスとは異なり、適時deleteが必要となる。また、QTextCodec::codecForXXX()などでは作成できないため、各自でnewを経由してcodecを作成する必要がある。
利用法は通常のQTextCodecと全く同じである。localeがjaの場合にはcodecForLocale()の代わりにQAutoJpCodecをnewすればよい。ただし、このcodecを用いる際には一通りの変換終了後にQTextCodec::name()を用いて読み込んだデータのエンコーディングを取得して、アプリに反映するべきだろう。
なお、QAutoJpCodecを通常の利用法(QTextCodec *への代入)ではlocale or 認識後のcodecと区別することは不可能である。このあたり、本来は認識前はlocaleではない独自のcodecとして振舞うべきかもしれない。
今後はこのcodec自体の仕様の詰めを行ない、ベータおよび正式リリースをまず検討する。また、今後の利用を考えると、QTextCodecPluginの形でこのcodecが利用できないかの調査、検討が必要だろう。そうすればQt自体の変更を行なわずにこのcodecの利用が行なえるはずだ。
その後、Kateなどへの適用を行なっていくことになるはず。


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

コメントを残す