QTextStream: Fix logical error in setEncoding
We only want to enable writing BOM if we have _not_ started writing. Fixes: QTBUG-106279 Change-Id: Ibcbc101b931615fddb2507f01307bf9619772d7b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit c76f7cbbcbe68bf785e8d8cbbe641cd6c0e42834) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
42c7bb44f9
commit
acaa3c6a33
@ -2941,7 +2941,7 @@ void QTextStream::setEncoding(QStringConverter::Encoding encoding)
|
||||
|
||||
d->encoding = encoding;
|
||||
d->toUtf16 = QStringDecoder(d->encoding);
|
||||
bool generateBOM = d->hasWrittenData && d->generateBOM;
|
||||
bool generateBOM = !d->hasWrittenData && d->generateBOM;
|
||||
d->fromUtf16 = QStringEncoder(d->encoding,
|
||||
generateBOM ? QStringEncoder::Flag::WriteBom : QStringEncoder::Flag::Default);
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <QDebug>
|
||||
#include <QElapsedTimer>
|
||||
#include <QFile>
|
||||
#include <QTemporaryFile>
|
||||
#include <QStringConverter>
|
||||
#include <QTcpSocket>
|
||||
#include <QTemporaryDir>
|
||||
@ -202,6 +203,9 @@ private slots:
|
||||
|
||||
void textModeOnEmptyRead();
|
||||
|
||||
void autodetectUnicode_data();
|
||||
void autodetectUnicode();
|
||||
|
||||
private:
|
||||
void generateLineData(bool for_QString);
|
||||
void generateAllData(bool for_QString);
|
||||
@ -3043,6 +3047,57 @@ void tst_QTextStream::textModeOnEmptyRead()
|
||||
QVERIFY(file.isTextModeEnabled());
|
||||
}
|
||||
|
||||
void tst_QTextStream::autodetectUnicode_data()
|
||||
{
|
||||
QTest::addColumn<QStringConverter::Encoding>("encoding");
|
||||
QTest::newRow("Utf8") << QStringConverter::Utf8;
|
||||
QTest::newRow("Utf16BE") << QStringConverter::Utf16BE;
|
||||
QTest::newRow("Utf16LE") << QStringConverter::Utf16LE;
|
||||
QTest::newRow("Utf32BE") << QStringConverter::Utf32BE;
|
||||
QTest::newRow("Utf32LE") << QStringConverter::Utf32LE;
|
||||
}
|
||||
|
||||
void tst_QTextStream::autodetectUnicode()
|
||||
{
|
||||
QFETCH(QStringConverter::Encoding, encoding);
|
||||
|
||||
QTemporaryFile file;
|
||||
QVERIFY(file.open());
|
||||
|
||||
QString original("HelloWorld👋");
|
||||
|
||||
{
|
||||
QTextStream out(&file);
|
||||
out.setGenerateByteOrderMark(true);
|
||||
out.setEncoding(encoding);
|
||||
out << original;
|
||||
}
|
||||
file.seek(0);
|
||||
{
|
||||
QTextStream in(&file);
|
||||
QString actual;
|
||||
in >> actual;
|
||||
QCOMPARE(actual, original);
|
||||
QCOMPARE(in.encoding(), encoding);
|
||||
}
|
||||
file.seek(0);
|
||||
// Again, but change order of calls to QTextStream...
|
||||
{
|
||||
QTextStream out(&file);
|
||||
out.setEncoding(encoding);
|
||||
out.setGenerateByteOrderMark(true);
|
||||
out << original;
|
||||
}
|
||||
file.seek(0);
|
||||
{
|
||||
QTextStream in(&file);
|
||||
QString actual;
|
||||
in >> actual;
|
||||
QCOMPARE(actual, original);
|
||||
QCOMPARE(in.encoding(), encoding);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user