From ee8d998ecfd7d7fec71610adef1127d6d95ca843 Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Mon, 15 Aug 2011 09:09:57 +0300 Subject: [PATCH] #12266: Fix str.capitalize() to correctly uppercase/lowercase titlecased and cased non-letter characters. --- Lib/test/string_tests.py | 17 +++++++++++++++++ Misc/NEWS | 12 ++++++++++++ Objects/unicodeobject.c | 4 ++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index fca38c3ea06..d7925290206 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -641,6 +641,23 @@ class CommonTest(BaseTest): self.checkequal('Aaaa', 'aaaa', 'capitalize') self.checkequal('Aaaa', 'AaAa', 'capitalize') + # check that titlecased chars are lowered correctly + # \u1ffc is the titlecased char + self.checkequal('\u1ffc\u1ff3\u1ff3\u1ff3', + '\u1ff3\u1ff3\u1ffc\u1ffc', 'capitalize') + # check with cased non-letter chars + self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd', + '\u24c5\u24ce\u24c9\u24bd\u24c4\u24c3', 'capitalize') + self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd', + '\u24df\u24e8\u24e3\u24d7\u24de\u24dd', 'capitalize') + self.checkequal('\u2160\u2171\u2172', + '\u2160\u2161\u2162', 'capitalize') + self.checkequal('\u2160\u2171\u2172', + '\u2170\u2171\u2172', 'capitalize') + # check with Ll chars with no upper - nothing changes here + self.checkequal('\u019b\u1d00\u1d86\u0221\u1fb7', + '\u019b\u1d00\u1d86\u0221\u1fb7', 'capitalize') + self.checkraises(TypeError, 'hello', 'capitalize', 42) def test_lower(self): diff --git a/Misc/NEWS b/Misc/NEWS index 328ec61c1ea..cbede912fc6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,6 +2,18 @@ Python News +++++++++++ +What's New in Python 3.2.3? +=========================== + +*Release date: XX-XXX-2011* + +Core and Builtins +----------------- + +- Issue #12266: Fix str.capitalize() to correctly uppercase/lowercase + titlecased and cased non-letter characters. + + What's New in Python 3.2.2? =========================== diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index a48b8b41b13..77f8dd5a810 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6658,13 +6658,13 @@ int fixcapitalize(PyUnicodeObject *self) if (len == 0) return 0; - if (Py_UNICODE_ISLOWER(*s)) { + if (!Py_UNICODE_ISUPPER(*s)) { *s = Py_UNICODE_TOUPPER(*s); status = 1; } s++; while (--len > 0) { - if (Py_UNICODE_ISUPPER(*s)) { + if (!Py_UNICODE_ISLOWER(*s)) { *s = Py_UNICODE_TOLOWER(*s); status = 1; }