diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 24d43dad88..943d8efe1d 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -10609,7 +10609,7 @@ QString QString::toHtmlEscaped() const /*! \internal */ -void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) +void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW { qt_from_latin1(reinterpret_cast(out), a, uint(len)); } diff --git a/src/corelib/tools/qstringbuilder.cpp b/src/corelib/tools/qstringbuilder.cpp index eba939a413..85babbd698 100644 --- a/src/corelib/tools/qstringbuilder.cpp +++ b/src/corelib/tools/qstringbuilder.cpp @@ -39,6 +39,7 @@ #include "qstringbuilder.h" #include +#include QT_BEGIN_NAMESPACE @@ -107,7 +108,7 @@ QT_BEGIN_NAMESPACE /*! \internal */ -void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out) +void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW { if (len == -1) { if (!a) @@ -116,6 +117,7 @@ void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out *out++ = QLatin1Char(*a++); if (!*a) return; + len = int(strlen(a)); } else { int i; for (i = 0; i < len && uchar(a[i]) < 0x80U; ++i) @@ -127,9 +129,7 @@ void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out } // we need to complement with UTF-8 appending - QString tmp = QString::fromUtf8(a, len); - memcpy(out, reinterpret_cast(tmp.constData()), sizeof(QChar) * tmp.size()); - out += tmp.size(); + out = QUtf8::convertToUnicode(out, a, len); } QT_END_NAMESPACE diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h index faf9eb4b4d..8ce98cbd71 100644 --- a/src/corelib/tools/qstringbuilder.h +++ b/src/corelib/tools/qstringbuilder.h @@ -58,12 +58,12 @@ QT_BEGIN_NAMESPACE struct Q_CORE_EXPORT QAbstractConcatenable { protected: - static void convertFromAscii(const char *a, int len, QChar *&out); - static inline void convertFromAscii(char a, QChar *&out) + static void convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW; + static inline void convertFromAscii(char a, QChar *&out) Q_DECL_NOTHROW { *out++ = QLatin1Char(a); } - static void appendLatin1To(const char *a, int len, QChar *out); + static void appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW; }; template struct QConcatenable {};