diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/doc/snippets/code/src_corelib_io_qtextstream.cpp | 2 | ||||
-rw-r--r-- | src/corelib/io/qfile.cpp | 5 | ||||
-rw-r--r-- | src/corelib/serialization/qtextstream.cpp | 39 | ||||
-rw-r--r-- | src/corelib/serialization/qtextstream.h | 3 | ||||
-rw-r--r-- | src/corelib/serialization/qtextstream_p.h | 1 | ||||
-rw-r--r-- | src/tools/uic/main.cpp | 4 | ||||
-rw-r--r-- | src/xml/dom/qdom.cpp | 21 |
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=\"" |