diff options
-rw-r--r-- | src/corelib/text/qstringconverter.cpp | 21 | ||||
-rw-r--r-- | src/corelib/text/qstringconverter.h | 8 | ||||
-rw-r--r-- | tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp | 53 |
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: |