summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qsettings.cpp9
-rw-r--r--src/corelib/io/qsettings_p.h2
-rw-r--r--tests/auto/corelib/io/qsettings/bom.ini4
-rw-r--r--tests/auto/corelib/io/qsettings/qsettings.qrc17
-rw-r--r--tests/auto/corelib/io/qsettings/tst_qsettings.cpp10
5 files changed, 33 insertions, 9 deletions
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index d896da176a..ebca7d57ff 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -1637,6 +1637,15 @@ bool QConfFileSettingsPrivate::readIniFile(const QByteArray &data,
int sectionPosition = 0;
bool ok = true;
+#ifndef QT_NO_TEXTCODEC
+ // detect utf8 BOM
+ const uchar *dd = (const uchar *)data.constData();
+ if (data.size() >= 3 && dd[0] == 0xef && dd[1] == 0xbb && dd[2] == 0xbf) {
+ iniCodec = QTextCodec::codecForName("UTF-8");
+ dataPos = 3;
+ }
+#endif
+
while (readIniLine(data, dataPos, lineStart, lineLen, equalsPos)) {
char ch = data.at(lineStart);
if (ch == '[') {
diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h
index cb29b4c83a..715f13530a 100644
--- a/src/corelib/io/qsettings_p.h
+++ b/src/corelib/io/qsettings_p.h
@@ -282,7 +282,7 @@ public:
bool isWritable() const;
QString fileName() const;
- static bool readIniFile(const QByteArray &data, UnparsedSettingsMap *unparsedIniSections);
+ bool readIniFile(const QByteArray &data, UnparsedSettingsMap *unparsedIniSections);
static bool readIniSection(const QSettingsKey &section, const QByteArray &data,
ParsedSettingsMap *settingsMap, QTextCodec *codec);
static bool readIniLine(const QByteArray &data, int &dataPos, int &lineStart, int &lineLen,
diff --git a/tests/auto/corelib/io/qsettings/bom.ini b/tests/auto/corelib/io/qsettings/bom.ini
new file mode 100644
index 0000000000..8d46ee8d91
--- /dev/null
+++ b/tests/auto/corelib/io/qsettings/bom.ini
@@ -0,0 +1,4 @@
+[section1]
+foo1=bar1
+[section2]
+foo2=bar2
diff --git a/tests/auto/corelib/io/qsettings/qsettings.qrc b/tests/auto/corelib/io/qsettings/qsettings.qrc
index 587c22ebe3..c0be7e013f 100644
--- a/tests/auto/corelib/io/qsettings/qsettings.qrc
+++ b/tests/auto/corelib/io/qsettings/qsettings.qrc
@@ -1,9 +1,10 @@
-<!DOCTYPE RCC><RCC version="1.0">
-<qresource>
- <file>resourcefile.ini</file>
- <file>resourcefile2.ini</file>
- <file>resourcefile3.ini</file>
- <file>resourcefile4.ini</file>
- <file>resourcefile5.ini</file>
-</qresource>
+<RCC>
+ <qresource prefix="/">
+ <file>resourcefile.ini</file>
+ <file>resourcefile2.ini</file>
+ <file>resourcefile3.ini</file>
+ <file>resourcefile4.ini</file>
+ <file>resourcefile5.ini</file>
+ <file>bom.ini</file>
+ </qresource>
</RCC>
diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
index 3e68e4859f..c89923f159 100644
--- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
+++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
@@ -161,6 +161,7 @@ private slots:
void testByteArray_data();
void testByteArray();
void iniCodec();
+ void bom();
private:
const bool m_canWriteNativeSystemSettings;
@@ -730,6 +731,15 @@ void tst_QSettings::iniCodec()
}
+void tst_QSettings::bom()
+{
+ QSettings s(":/bom.ini", QSettings::IniFormat);
+ QStringList allkeys = s.allKeys();
+ QCOMPARE(allkeys.size(), 2);
+ QVERIFY(allkeys.contains("section1/foo1"));
+ QVERIFY(allkeys.contains("section2/foo2"));
+}
+
void tst_QSettings::testErrorHandling_data()
{
QTest::addColumn<int>("filePerms"); // -1 means file should not exist