Remove QTextCodec dependency from QClipboard

QClipboard used QTextCodec to convert the war clipboard data to
a QString. HTML is nowadays always encoded as utf8, and we were only
supporting utf based encodings for other text.

Add a qFromUtfEncoded() to our UTF helpers that auto detects utf16
and utf32 byte order marks, and assumes utf8 otherwise, to keep
this compatible with what we have been doing in Qt 5.

Change-Id: I5a9fccb67a88dff27cbbdecff9bd548d31aa1c6c
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
Lars Knoll 2020-04-07 11:14:06 +02:00
parent 50916edd9d
commit ff0d02eb2f
3 changed files with 30 additions and 8 deletions

View File

@ -972,6 +972,25 @@ QString QUtf32::convertToUnicode(const char *chars, int len, QTextCodec::Convert
return result;
}
QString qFromUtfEncoded(const QByteArray &ba)
{
const int arraySize = ba.size();
const uchar *buf = reinterpret_cast<const uchar *>(ba.constData());
const uint bom = 0xfeff;
if (arraySize > 3) {
uint uc = qFromUnaligned<uint>(buf);
if (uc == qToBigEndian(bom) || uc == qToLittleEndian(bom))
return QUtf32::convertToUnicode(ba.constData(), ba.length(), nullptr); // utf-32
}
if (arraySize > 1) {
ushort uc = qFromUnaligned<ushort>(buf);
if (uc == qToBigEndian(ushort(bom)) || qToLittleEndian(ushort(bom)))
return QUtf16::convertToUnicode(ba.constData(), ba.length(), nullptr); // utf-16
}
return QUtf8::convertToUnicode(ba.constData(), ba.length());
}
#if QT_CONFIG(textcodec)

View File

@ -54,6 +54,7 @@
#include <QtCore/qstring.h>
#include <QtCore/qlist.h>
#include <QtCore/qendian.h>
#if QT_CONFIG(textcodec)
#include "QtCore/qtextcodec.h"
@ -317,6 +318,13 @@ struct QUtf32
static QByteArray convertFromUnicode(const QChar *, int, QTextCodec::ConverterState *, DataEndianness = DetectEndianness);
};
/*
Converts from different utf encodings looking at a possible byte order mark at the
beginning of the string. If no BOM exists, utf-8 is assumed.
*/
QString Q_CORE_EXPORT qFromUtfEncoded(const QByteArray &ba);
#if QT_CONFIG(textcodec)
class QUtf8Codec : public QTextCodec {

View File

@ -47,7 +47,7 @@
#include "qbuffer.h"
#include "qimage.h"
#if QT_CONFIG(textcodec)
#include "qtextcodec.h"
#include "private/qutfcodec_p.h"
#endif
#include "private/qguiapplication_p.h"
@ -301,14 +301,9 @@ QString QClipboard::text(QString &subtype, Mode mode) const
const QByteArray rawData = data->data(QLatin1String("text/") + subtype);
#if QT_CONFIG(textcodec)
QTextCodec* codec = QTextCodec::codecForMib(106); // utf-8 is default
if (subtype == QLatin1String("html"))
codec = QTextCodec::codecForHtml(rawData, codec);
else
codec = QTextCodec::codecForUtfText(rawData, codec);
return codec->toUnicode(rawData);
return qFromUtfEncoded(rawData);
#else // textcodec
return rawData;
return QString::fromUtf8(rawData);
#endif // textcodec
}