村田さん
大田です。はじめまして。 パッチありがとうございます。
とりあえずソースをダウンロードしてパッチ当てまでやりましたが,ビルドは時間がかかりそうなので 週末にでもやって試してみます(仕事の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);
==============================================================================