[Qt-users:519] Re: 全角文字環境固有のQt Creatorのバグ

Hiroshi Ota hi_ohta @ lasertec.co.jp
2016年 3月 25日 (金) 17:31:09 JST


村田さん

大田です。はじめまして。
パッチありがとうございます。

とりあえずソースをダウンロードしてパッチ当てまでやりましたが,ビルドは時間がかかりそうなので
週末にでもやって試してみます(仕事のPCがショボい)。

パッチ部分しか見ていませんが,fromLocal8Bit()/toLocal8Bit()が使われていたんですね。
ということは,基本的に.proファイルのエンコーディングはシステムロケールに従ったものであることが
前提で作られているように思えます。日本語WindowsならShift-JISということになるんでしょう。
実際,Shift-JISならファイルを追加しても文字化けは発生しません。

.proをUTF-8に限定すれば村田さんのパッチでクリアできると思うので,使わせていただこうと思います。

Qt Creator内部にはファイルのエンコーディングを自動認識する機能が備わっているでしょうから,それを
使って.proのエンコーディングを検知し,QTextCodec::setCodecForLocale()してから fromLocal8Bit()/toLocal8Bit()
というのが本筋でしょうか...

中身のわかってない素人考えですので,違ったら笑ってやってください。
ありがとうございました。


On 2016/03/25 8:08, MURATA Yasuhisa wrote:
> 生理学研究所の村田です。
>
> Qt Creator 3.6.1 のソース中の
> src/plugins/qmakeprojectmanager/qmakenodes.cpp
> を下記のように変更してビルドしてみたところ、
> 文字化けしなくなりました。
>
> ご参考まで。
>
> ==============================================================================
> *** qmakenodes.cpp_orig 2016-03-08 20:30:19.000000000 +0900
> --- qmakenodes.cpp      2016-03-24 17:57:49.000000000 +0900
> ***************
> *** 1232,1238 ****
>                    QmakeProject::proFileParseError(reader.errorString());
>                    return qMakePair(includeFile, lines);
>                }
> !             contents = QString::fromLocal8Bit(reader.data());
>                lines = contents.split(QLatin1Char('\n'));
>            }
>
> --- 1232,1238 ----
>                    QmakeProject::proFileParseError(reader.errorString());
>                    return qMakePair(includeFile, lines);
>                }
> !             contents = QString::fromUtf8(reader.data());
>                lines = contents.split(QLatin1Char('\n'));
>            }
>
> ***************
> *** 1347,1353 ****
>    {
>        Core::DocumentManager::expectFileChange(m_projectFilePath.toString());
>        FileSaver saver(m_projectFilePath.toString(), QIODevice::Text);
> !     saver.write(lines.join(QLatin1Char('\n')).toLocal8Bit());
>        saver.finalize(Core::ICore::mainWindow());
>
>        m_project->qmakeProjectManager()->notifyChanged(m_projectFilePath);
> --- 1347,1353 ----
>    {
>        Core::DocumentManager::expectFileChange(m_projectFilePath.toString());
>        FileSaver saver(m_projectFilePath.toString(), QIODevice::Text);
> !     saver.write(lines.join(QLatin1Char('\n')).toUtf8());
>        saver.finalize(Core::ICore::mainWindow());
>
>        m_project->qmakeProjectManager()->notifyChanged(m_projectFilePath);
> ==============================================================================
>



Qt-users メーリングリストの案内