2月 092004
QTextStreamにsetCodecでセットして使おうとすると、うまく動作しないようだ。
これを修正すれば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
こっちではお初です。
QTextStreamを使う場合、
QString str;
QTextCodec *codec = new QAutoJpCodec();
QTextStream ts( &str, IO_WriteOnly );
ts.setCodec(codec);
…
ts sourceTypeはQTextStream::QTextStream( QString& str, int filemode )で設定されているので、
QTextStreamはこういう使い方をする仕様では無く↓の様な感じを意図して作られているのではないでしょうか?
QString str;
QTextCodec *codec = new QAutoJpCodec();
QTextStream ts( &str, IO_WriteOnly );
ts -> toUnicode(buffer);
どうも。
前半のコードは問題のない、QTextStreamの利用方のソースですよ。後半の方はコードが足りていないので、ちょっと意図する内容が読みとれませんが、QTextStream自体にcodecを設定できるがゆえに操作が楽になっているというのがありますので、前半のコードが動かないようではcodecとしていまいちです。
で、QTextStreamクラスのソースを読んで確認を行なっていたりしたのですが、QTextStream::operator
(HTMLの特殊文字が通らないのでなんか変になってしまいました。文が抜け落ちてる。。。)
言いたかったのはAsakiさんは「内部でgetc系の関数だけを用いて読み込みを行なっています。内部で折角QTextStreamm:ts_getline()なる関数が用意されているのに、readLine()の場合にすら使っていません。」と書かれていますが、俺はこれがQTextStreamを書いた人が意図した事だと思うのです。
ts_getline()をわざわざ使わないで実装しているような気が。
というのも、前半のコードの場合QTextStream::QTextStream( QString& str, int filemode )を使っているのでd-sourceType = QTextStreamPrivate::String;とされ、setEncoding()の最初で跳ね付けられているからです。
(前半のコードの後でts->codec == 0となっているのが確認できます)
つまりQStringをバッファーとして利用する場合にはUnicodeを渡される事が前提となっているため、QTextStreamからはcodecを使用するような機能が削られていると思うのです。
ああ、よく見たら、最初のコードもQStringから読み込んでたんですね。QStringから読み込む際にはcodecは無視されるのはソースを読んで確認してあります。私が問題視していたのはファイルから読み込む際にも一文字ずつQTextCodecに渡されるため、非常に自動認識には不向きであるということです。
ts_getline()を用いていないのは何故かはTrollTechの人に聞かないとわからないでしょうが、#if 0でくくってあるコードがあったり、ts_getline()が実装されている以上は利用するつもりはあったのではないかと思っています。ただ、QTextCodec::readLine()のコードをみているとわかることですが、ts_getc()を用いた方がts_getline()を用いるよりもコードが単純です。バグの可能性やメンテのコスト等を考慮したのではないかと想像しています。若干はパフォーマンスが落ちる可能性はあるかもしれませんが、動作が確実であれば問題のないレベルでしょうし。