From 556a836e0f3bebc68227f516112cbd714cd01c9e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 23 Mar 2012 15:13:13 +0000 Subject: [PATCH] Don't cache incorrect length in wxString::assign(char*, size_t). The length of the string here is specified in bytes and is not the same as the string length for non-ASCII UTF-8 strings, so don't cache it as the string length. Just invalidate the cached length instead as we simply don't know what the real length of the string is going to be. See #14130. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70987 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/string.h | 2 +- tests/strings/strings.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/wx/string.h b/include/wx/string.h index 4591e1b..03c21a7 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -2669,7 +2669,7 @@ public: wxString& assign(const char *sz, size_t n) { - wxSTRING_SET_CACHED_LENGTH(n); + wxSTRING_INVALIDATE_CACHE(); SubstrBufFromMB str(ImplStr(sz, n)); m_impl.assign(str.data, str.len); diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index 879fab7..1390497 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -192,6 +192,12 @@ void StringTestCase::Constructors() CPPUNIT_ASSERT_EQUAL( 0, wxString(wxString(), 17).length() ); + // This string has 3 characters (, and ), not 4! + wxString s3("h\xc3\xa9llo", 4); + CPPUNIT_ASSERT_EQUAL( 3, s3.length() ); + CPPUNIT_ASSERT_EQUAL( 'l', (char)s3[2] ); + + static const char *s = "?really!"; const char *start = wxStrchr(s, 'r'); const char *end = wxStrchr(s, '!'); @@ -219,6 +225,9 @@ void StringTestCase::StaticConstructors() CPPUNIT_ASSERT_EQUAL( "Hello", wxString::FromUTF8("Hello", 5) ); CPPUNIT_ASSERT_EQUAL( "Hello", wxString::FromUTF8("Hello") ); + CPPUNIT_ASSERT_EQUAL( 2, wxString::FromUTF8("h\xc3\xa9llo", 3).length() ); + + //CPPUNIT_ASSERT_EQUAL( 1, wxString::FromUTF8("", 1).length() ); } -- 2.7.4