summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp2
-rw-r--r--src/corelib/io/qfile.cpp5
-rw-r--r--src/corelib/serialization/qtextstream.cpp39
-rw-r--r--src/corelib/serialization/qtextstream.h3
-rw-r--r--src/corelib/serialization/qtextstream_p.h1
-rw-r--r--src/tools/uic/main.cpp4
-rw-r--r--src/xml/dom/qdom.cpp21
7 files changed, 56 insertions, 19 deletions
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
index c30f13df5a..4795650748 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp
@@ -135,5 +135,5 @@ stream << '\n' << Qt::flush;
//! [10]
QTextStream out(&file);
-out.setCodec("UTF-8");
+out.setEncoding(QStringConverter::Utf8);
//! [10]
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 2a9c24bbd5..2544496c32 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -173,9 +173,8 @@ QAbstractFileEngine *QFilePrivate::engine() const
QTextStream takes care of converting the 8-bit data stored on
disk into a 16-bit Unicode QString. By default, it assumes that
- the user system's local 8-bit encoding is used (e.g., UTF-8
- on most unix based operating systems; see QTextCodec::codecForLocale() for
- details). This can be changed using \l QTextStream::setCodec().
+ the file is encoded in UTF-8. This can be changed using
+ \l QTextStream::setEncoding().
To write text, we can use operator<<(), which is overloaded to
take a QTextStream on the left and various data types (including
diff --git a/src/corelib/serialization/qtextstream.cpp b/src/corelib/serialization/qtextstream.cpp
index a2af401a41..df683d74da 100644
--- a/src/corelib/serialization/qtextstream.cpp
+++ b/src/corelib/serialization/qtextstream.cpp
@@ -3157,6 +3157,45 @@ QTextStream &bom(QTextStream &stream)
} // namespace Qt
+
+/*!
+ Sets the encoding for this stream to \a encoding. The encoding is used for
+ decoding any data that is read from the assigned device, and for
+ encoding any data that is written. By default,
+ QStringConverter::Utf8 is used, and automatic unicode
+ detection is enabled.
+
+ If QTextStream operates on a string, this function does nothing.
+
+ \warning If you call this function while the text stream is reading
+ from an open sequential socket, the internal buffer may still contain
+ text decoded using the old encoding.
+
+ \sa encoding(), setAutoDetectUnicode(), setLocale()
+*/
+void QTextStream::setEncoding(QStringConverter::Encoding encoding)
+{
+ Q_D(QTextStream);
+ d->encoding = encoding;
+#if QT_CONFIG(textcodec)
+ // FIXME: This is temporary until QTextStream is converted to use QStringConverter
+ const char *name = QStringConverter::nameForEncoding(encoding);
+ auto codec = QTextCodec::codecForName(name);
+ setCodec(codec);
+#endif
+}
+
+/*!
+ Returns the encoding that is current assigned to the stream.
+
+ \sa setEncoding(), setAutoDetectUnicode(), locale()
+*/
+QStringConverter::Encoding QTextStream::encoding() const
+{
+ Q_D(const QTextStream);
+ return d->encoding;
+}
+
/*!
Sets the codec for this stream to \a codec. The codec is used for
decoding any data that is read from the assigned device, and for
diff --git a/src/corelib/serialization/qtextstream.h b/src/corelib/serialization/qtextstream.h
index 97d596137e..9daa87947c 100644
--- a/src/corelib/serialization/qtextstream.h
+++ b/src/corelib/serialization/qtextstream.h
@@ -45,6 +45,7 @@
#include <QtCore/qchar.h>
#include <QtCore/qlocale.h>
#include <QtCore/qscopedpointer.h>
+#include <QtCore/qstringconverter.h>
#include <stdio.h>
@@ -98,6 +99,8 @@ public:
explicit QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly);
virtual ~QTextStream();
+ void setEncoding(QStringConverter::Encoding encoding);
+ QStringConverter::Encoding encoding() const;
#if QT_CONFIG(textcodec)
void setCodec(QTextCodec *codec);
void setCodec(const char *codecName);
diff --git a/src/corelib/serialization/qtextstream_p.h b/src/corelib/serialization/qtextstream_p.h
index 172824d27d..2cf548bca6 100644
--- a/src/corelib/serialization/qtextstream_p.h
+++ b/src/corelib/serialization/qtextstream_p.h
@@ -118,6 +118,7 @@ public:
int stringOffset;
QIODevice::OpenMode stringOpenMode;
+ QStringConverter::Encoding encoding = QStringConverter::Utf8;
#if QT_CONFIG(textcodec)
// codec
QTextCodec *codec;
diff --git a/src/tools/uic/main.cpp b/src/tools/uic/main.cpp
index 81492bbf45..8327dd5829 100644
--- a/src/tools/uic/main.cpp
+++ b/src/tools/uic/main.cpp
@@ -161,9 +161,7 @@ int runUic(int argc, char *argv[])
return 1;
}
out = new QTextStream(&f);
-#if QT_CONFIG(textcodec)
- out->setCodec(QTextCodec::codecForName("UTF-8"));
-#endif
+ out->setEncoding(QStringConverter::Utf8);
}
bool rtn = driver.uic(inputFile, out);
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index 022de70090..5224c8b31c 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -5964,8 +5964,6 @@ void QDomDocumentPrivate::saveDocument(QTextStream& s, const int indent, QDomNod
#if QT_CONFIG(textcodec) && QT_CONFIG(regularexpression)
const QDomNodePrivate* n = first;
- QTextCodec *codec = nullptr;
-
if (n && n->isProcessingInstruction() && n->nodeName() == QLatin1String("xml")) {
// we have an XML declaration
QString data = n->nodeValue();
@@ -5974,13 +5972,14 @@ void QDomDocumentPrivate::saveDocument(QTextStream& s, const int indent, QDomNod
QString enc = match.captured(3);
if (enc.isEmpty())
enc = match.captured(5);
- if (!enc.isEmpty())
- codec = QTextCodec::codecForName(std::move(enc).toLatin1());
+ if (!enc.isEmpty()) {
+ auto encoding = QStringConverter::encodingForName(enc.toUtf8().constData());
+ if (!encoding)
+ qWarning() << "QDomDocument::save(): Unsupported encoding" << enc << "specified.";
+ else
+ s.setEncoding(encoding.value());
+ }
}
- if (!codec)
- codec = QTextCodec::codecForName("UTF-8");
- if (codec)
- s.setCodec(codec);
#endif
bool doc = false;
@@ -5998,11 +5997,9 @@ void QDomDocumentPrivate::saveDocument(QTextStream& s, const int indent, QDomNod
// Write out the XML declaration.
#if !QT_CONFIG(textcodec)
- const QLatin1String codecName("iso-8859-1");
+ const QLatin1String codecName("UTF-8");
#else
- const QTextCodec *const codec = s.codec();
- Q_ASSERT_X(codec, "QDomNode::save()", "A codec must be specified in the text stream.");
- const QByteArray codecName = codec->name();
+ const QByteArray codecName = QStringConverter::nameForEncoding(s.encoding());
#endif
s << "<?xml version=\"1.0\" encoding=\""