diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2013-02-26 12:41:59 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-02-27 03:13:30 +0100 |
commit | 996db96d5eb4927a130605e8c1820d7e1b303191 (patch) | |
tree | 894ce9fb99955ba2f607b1d7e11bd371c465a860 | |
parent | 7729d89e15bc68899554b28f480a891c61ef0872 (diff) |
Fix QString::toUcs4() returns incorrectly resized QVector
...when the string contains surrogate code points.
Task-number: QTBUG-25536
Change-Id: I07251fee641c14f33175678768ddbe551dbe2bb1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/tools/qstring.cpp | 15 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qstring/tst_qstring.cpp | 48 |
2 files changed, 56 insertions, 7 deletions
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index bbe7628d38..3089cfef8b 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -966,20 +966,21 @@ const QString::Null QString::null = { }; \sa utf16(), toLatin1(), toUtf8(), toLocal8Bit() */ -// ### replace with QCharIterator int QString::toUcs4_helper(const ushort *uc, int length, uint *out) { int i = 0; - for (; i < length; ++i) { - uint u = uc[i]; - if (QChar::isHighSurrogate(u) && i + 1 < length) { - ushort low = uc[i+1]; + const ushort *const e = uc + length; + while (uc < e) { + uint u = *uc; + if (QChar::isHighSurrogate(u) && uc + 1 < e) { + ushort low = uc[1]; if (QChar::isLowSurrogate(low)) { - ++i; + ++uc; u = QChar::surrogateToUcs4(u, low); } } - *out++ = u; + out[i++] = u; + ++uc; } return i; } diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp index c902d421ed..aa61885a47 100644 --- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp @@ -195,6 +195,8 @@ private slots: void stringRef_local8Bit(); void fromLatin1(); void fromAscii(); + void fromUcs4(); + void toUcs4(); void arg(); void number(); void arg_fillChar_data(); @@ -3931,6 +3933,52 @@ void tst_QString::fromAscii() QVERIFY(a.size() == 5); } +void tst_QString::fromUcs4() +{ + QString s; + s = QString::fromUcs4( 0 ); + QVERIFY( s.isNull() ); + QCOMPARE( s.size(), 0 ); + s = QString::fromUcs4( 0, 0 ); + QVERIFY( s.isNull() ); + QCOMPARE( s.size(), 0 ); + s = QString::fromUcs4( 0, 5 ); + QVERIFY( s.isNull() ); + QCOMPARE( s.size(), 0 ); + + uint nil = '\0'; + s = QString::fromUcs4( &nil ); + QVERIFY( !s.isNull() ); + QCOMPARE( s.size(), 0 ); + s = QString::fromUcs4( &nil, 0 ); + QVERIFY( !s.isNull() ); + QCOMPARE( s.size(), 0 ); + + uint bmp = 'a'; + s = QString::fromUcs4( &bmp, 1 ); + QVERIFY( !s.isNull() ); + QCOMPARE( s.size(), 1 ); + + uint smp = 0x10000; + s = QString::fromUcs4( &smp, 1 ); + QVERIFY( !s.isNull() ); + QCOMPARE( s.size(), 2 ); +} + +void tst_QString::toUcs4() +{ + QString s; + QCOMPARE( s.toUcs4().size(), 0 ); + + QChar bmp = QLatin1Char('a'); + s = QString(&bmp, 1); + QCOMPARE( s.toUcs4().size(), 1 ); + + QChar smp[] = { QChar::highSurrogate(0x10000), QChar::lowSurrogate(0x10000) }; + s = QString(smp, 2); + QCOMPARE( s.toUcs4().size(), 1 ); +} + void tst_QString::arg() { /* |