diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index b0b78cd10b0..3e132cf155e 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -9374,6 +9374,26 @@ QString::iterator QString::erase(QString::const_iterator first, QString::const_i \sa toLatin1(), toUtf8(), toLocal8Bit(), QByteArray::toStdString() */ +std::string QString::toStdString() const +{ + std::string result; + if (isEmpty()) + return result; + + auto writeToBuffer = [this](char *out, size_t) { + char *last = QUtf8::convertFromUnicode(out, *this); + return last - out; + }; + size_t maxSize = size() * 3; // worst case for UTF-8 +#ifdef __cpp_lib_string_resize_and_overwrite + // C++23 + result.resize_and_overwrite(maxSize, writeToBuffer); +#else + result.resize(maxSize); + result.resize(writeToBuffer(result.data(), result.size())); +#endif + return result; +} /*! \fn QString QString::fromRawData(const char16_t *unicode, qsizetype size) diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index 8687142cd2d..2ffc7f5d030 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -1086,7 +1086,7 @@ public: } static inline QString fromStdString(const std::string &s); - inline std::string toStdString() const; + std::string toStdString() const; static inline QString fromStdWString(const std::wstring &s); inline std::wstring toStdWString() const; @@ -1573,9 +1573,6 @@ QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs, const QByteArray &rhs # endif // QT_NO_CAST_FROM_ASCII #endif // QT_USE_QSTRINGBUILDER -std::string QString::toStdString() const -{ return toUtf8().toStdString(); } - QString QString::fromStdString(const std::string &s) { return fromUtf8(s.data(), qsizetype(s.size())); } diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp index 7fb903e919c..694aea19c6b 100644 --- a/src/corelib/text/qstringconverter.cpp +++ b/src/corelib/text/qstringconverter.cpp @@ -691,6 +691,14 @@ char *QUtf8::convertFromUnicode(char *out, QStringView in, OnErrorLambda &&onErr return reinterpret_cast(dst); } +char *QUtf8::convertFromUnicode(char *dst, QStringView in) noexcept +{ + return convertFromUnicode(dst, in, [](auto *dst, ...) { + // encoding error - append '?' + *dst++ = '?'; + }); +} + QByteArray QUtf8::convertFromUnicode(QStringView in) { qsizetype len = in.size(); @@ -698,11 +706,7 @@ QByteArray QUtf8::convertFromUnicode(QStringView in) // create a QByteArray with the worst case scenario size QByteArray result(len * 3, Qt::Uninitialized); char *dst = const_cast(result.constData()); - dst = convertFromUnicode(dst, in, [](auto *dst, ...) { - // encoding error - append '?' - *dst++ = '?'; - }); - + dst = convertFromUnicode(dst, in); result.truncate(dst - result.constData()); return result; } diff --git a/src/corelib/text/qstringconverter_p.h b/src/corelib/text/qstringconverter_p.h index 775b8f7a180..442444d82b9 100644 --- a/src/corelib/text/qstringconverter_p.h +++ b/src/corelib/text/qstringconverter_p.h @@ -320,6 +320,7 @@ struct QUtf8 static char16_t *convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state); + static char *convertFromUnicode(char *dst, QStringView in) noexcept; Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in); Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state); static char *convertFromUnicode(char *out, QStringView in, QStringConverter::State *state);