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->encoding = encoding;
|
||||||
d->toUtf16 = QStringDecoder(d->encoding);
|
d->toUtf16 = QStringDecoder(d->encoding);
|
||||||
bool generateBOM = d->hasWrittenData && d->generateBOM;
|
bool generateBOM = !d->hasWrittenData && d->generateBOM;
|
||||||
d->fromUtf16 = QStringEncoder(d->encoding,
|
d->fromUtf16 = QStringEncoder(d->encoding,
|
||||||
generateBOM ? QStringEncoder::Flag::WriteBom : QStringEncoder::Flag::Default);
|
generateBOM ? QStringEncoder::Flag::WriteBom : QStringEncoder::Flag::Default);
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QElapsedTimer>
|
#include <QElapsedTimer>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QTemporaryFile>
|
||||||
#include <QStringConverter>
|
#include <QStringConverter>
|
||||||
#include <QTcpSocket>
|
#include <QTcpSocket>
|
||||||
#include <QTemporaryDir>
|
#include <QTemporaryDir>
|
||||||
@ -202,6 +203,9 @@ private slots:
|
|||||||
|
|
||||||
void textModeOnEmptyRead();
|
void textModeOnEmptyRead();
|
||||||
|
|
||||||
|
void autodetectUnicode_data();
|
||||||
|
void autodetectUnicode();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void generateLineData(bool for_QString);
|
void generateLineData(bool for_QString);
|
||||||
void generateAllData(bool for_QString);
|
void generateAllData(bool for_QString);
|
||||||
@ -3043,6 +3047,57 @@ void tst_QTextStream::textModeOnEmptyRead()
|
|||||||
QVERIFY(file.isTextModeEnabled());
|
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