summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/text/qstringconverter.cpp21
-rw-r--r--src/corelib/text/qstringconverter.h8
-rw-r--r--tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp53
3 files changed, 77 insertions, 5 deletions
diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp
index 9322fcd35e..4972bcde4f 100644
--- a/src/corelib/text/qstringconverter.cpp
+++ b/src/corelib/text/qstringconverter.cpp
@@ -1475,12 +1475,25 @@ static bool nameMatch(const char *a, const char *b)
QStringConverter::QStringConverter(const char *name)
: iface(nullptr)
{
+ auto e = encodingForName(name);
+ if (e)
+ iface = encodingInterfaces + int(e.value());
+}
+
+std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name)
+{
for (int i = 0; i < LastEncoding + 1; ++i) {
- if (nameMatch(encodingInterfaces[i].name, name)) {
- iface = encodingInterfaces + i;
- break;
- }
+ if (nameMatch(encodingInterfaces[i].name, name))
+ return QStringConverter::Encoding(i);
}
+ if (nameMatch(name, "latin1"))
+ return QStringConverter::Latin1;
+ return std::nullopt;
+}
+
+const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
+{
+ return encodingInterfaces[int(e)].name;
}
QT_END_NAMESPACE
diff --git a/src/corelib/text/qstringconverter.h b/src/corelib/text/qstringconverter.h
index 73f9f4f9ba..fe401ecc9e 100644
--- a/src/corelib/text/qstringconverter.h
+++ b/src/corelib/text/qstringconverter.h
@@ -45,6 +45,8 @@
#include <QtCore/qstringbuilder.h>
#endif
+#include <optional>
+
QT_BEGIN_NAMESPACE
// work around a compiler bug in GCC 7
@@ -148,7 +150,8 @@ protected:
QSTRINGCONVERTER_CONSTEXPR QStringConverter(const Interface *i)
: iface(i)
{}
- QStringConverter(const char *name);
+ Q_CORE_EXPORT QStringConverter(const char *name);
+
public:
bool isValid() const { return iface != nullptr; }
@@ -162,6 +165,9 @@ public:
const char *name() const
{ return isValid() ? iface->name : nullptr; }
+ Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name);
+ Q_CORE_EXPORT static const char *nameForEncoding(Encoding e);
+
protected:
const Interface *iface;
State state;
diff --git a/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp b/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp
index 1419321679..f0e794e910 100644
--- a/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp
+++ b/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp
@@ -59,6 +59,12 @@ private slots:
void utfHeaders_data();
void utfHeaders();
+
+ void encodingForName_data();
+ void encodingForName();
+
+ void nameForEncoding_data();
+ void nameForEncoding();
};
void tst_QStringConverter::constructByName()
@@ -1611,6 +1617,53 @@ void tst_QStringConverter::utfHeaders()
}
}
+void tst_QStringConverter::encodingForName_data()
+{
+ QTest::addColumn<QByteArray>("name");
+ QTest::addColumn<std::optional<QStringConverter::Encoding>>("encoding");
+
+ QTest::newRow("UTF-8") << QByteArray("UTF-8") << std::optional<QStringConverter::Encoding>(QStringConverter::Utf8);
+ QTest::newRow("utf8") << QByteArray("utf8") << std::optional<QStringConverter::Encoding>(QStringConverter::Utf8);
+ QTest::newRow("Utf-8") << QByteArray("Utf-8") << std::optional<QStringConverter::Encoding>(QStringConverter::Utf8);
+ QTest::newRow("UTF-16") << QByteArray("UTF-16") << std::optional<QStringConverter::Encoding>(QStringConverter::Utf16);
+ QTest::newRow("UTF-16le") << QByteArray("UTF-16le") << std::optional<QStringConverter::Encoding>(QStringConverter::Utf16LE);
+ QTest::newRow("ISO-8859-1") << QByteArray("ISO-8859-1") << std::optional<QStringConverter::Encoding>(QStringConverter::Latin1);
+ QTest::newRow("ISO8859-1") << QByteArray("ISO8859-1") << std::optional<QStringConverter::Encoding>(QStringConverter::Latin1);
+ QTest::newRow("iso8859-1") << QByteArray("iso8859-1") << std::optional<QStringConverter::Encoding>(QStringConverter::Latin1);
+ QTest::newRow("latin1") << QByteArray("latin1") << std::optional<QStringConverter::Encoding>(QStringConverter::Latin1);
+ QTest::newRow("latin2") << QByteArray("latin2") << std::optional<QStringConverter::Encoding>();
+ QTest::newRow("latin15") << QByteArray("latin15") << std::optional<QStringConverter::Encoding>();
+}
+
+void tst_QStringConverter::encodingForName()
+{
+ QFETCH(QByteArray, name);
+ QFETCH(std::optional<QStringConverter::Encoding>, encoding);
+
+ auto e = QStringConverter::encodingForName(name);
+ QCOMPARE(e, encoding);
+}
+
+void tst_QStringConverter::nameForEncoding_data()
+{
+ QTest::addColumn<QByteArray>("name");
+ QTest::addColumn<QStringConverter::Encoding>("encoding");
+
+ QTest::newRow("UTF-8") << QByteArray("UTF-8") << QStringConverter::Utf8;
+ QTest::newRow("UTF-16") << QByteArray("UTF-16") << QStringConverter::Utf16;
+ QTest::newRow("UTF-16LE") << QByteArray("UTF-16LE") << QStringConverter::Utf16LE;
+ QTest::newRow("ISO-8859-1") << QByteArray("ISO-8859-1") << QStringConverter::Latin1;
+}
+
+void tst_QStringConverter::nameForEncoding()
+{
+ QFETCH(QByteArray, name);
+ QFETCH(QStringConverter::Encoding, encoding);
+
+ QByteArray n = QStringConverter::nameForEncoding(encoding);
+ QCOMPARE(n, name);
+}
+
class LoadAndConvert: public QRunnable
{
public: