C++: change working-copy to work on UTF-8 encoded QByteArrays.

These not only take less space than UTF-16 encoded QStrings, but due to
the caching in the CppEditorSupport also take less time to build.

This patch also fixes a number of possible encoding issues, where files
and constant strings were (falsely) assumed to be UTF-8.

Change-Id: Ib6f91c9a94ebed5b5dfbd4eb2998825c62c72784
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
Erik Verbruggen
2013-08-19 15:47:51 +02:00
parent eebb1dfcf4
commit f7c68f6baf
24 changed files with 118 additions and 67 deletions

View File

@@ -271,6 +271,39 @@ TextFileFormat::ReadResult
return result;
}
TextFileFormat::ReadResult TextFileFormat::readFileUTF8(const QString &fileName,
QByteArray *plainText, QString *errorString)
{
QByteArray data;
try {
Utils::FileReader reader;
if (!reader.fetch(fileName, errorString))
return TextFileFormat::ReadIOError;
data = reader.data();
} catch (const std::bad_alloc &) {
*errorString = QCoreApplication::translate("Utils::TextFileFormat", "Out of memory.");
return TextFileFormat::ReadMemoryAllocationError;
}
TextFileFormat format = TextFileFormat::detect(data);
if (!format.codec)
format.codec = QTextCodec::codecForLocale();
if (format.codec->name() == "UTF-8") {
if (format.hasUtf8Bom)
data.remove(0, 3);
*plainText = data;
return TextFileFormat::ReadSuccess;
}
QString target;
if (!format.decode(data, &target)) {
*errorString = QCoreApplication::translate("Utils::TextFileFormat", "An encoding error was encountered.");
return TextFileFormat::ReadEncodingError;
}
*plainText = target.toUtf8();
return TextFileFormat::ReadSuccess;
}
/*!
\brief Write out a text file.
*/