diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 0023bf44069..92353f1ea97 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -6,7 +6,7 @@ """#" import unittest, test.test_support -import hashlib +import hashlib, sys encoding = 'utf-8' @@ -214,6 +214,10 @@ class UnicodeMiscTest(UnicodeDatabaseTest): count += 1 self.assert_(count >= 10) # should have tested at least the ASCII digits + def test_bug_1704793(self): + if sys.maxunicode == 65535: + self.assertRaises(KeyError, self.db.lookup, "GOTHIC LETTER FAIHU") + def test_main(): test.test_support.run_unittest( UnicodeMiscTest, diff --git a/Misc/NEWS b/Misc/NEWS index 8ca898b469d..f42c8ec7405 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -26,6 +26,9 @@ Core and builtins Library ------- +- Bug #1704793: Raise KeyError if unicodedata.lookup cannot + represent the result in a single character. + - Change location of the package index to pypi.python.org/pypi - Bug #1701409: Fix a segfault in printing ctypes.c_char_p and diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index a30d30c8eb7..1a32b644743 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1102,8 +1102,18 @@ unicodedata_lookup(PyObject* self, PyObject* args) return NULL; } +#ifndef Py_UNICODE_WIDE + if (code >= 0x10000) { + /* Raise KeyError for compatibility; the possibly more + correct ValueError was not documented as a possible + exception for 2.5.x and earlier. */ + PyErr_Format(PyExc_KeyError, "result %d larger than sys.maxunicode", + code); + return NULL; + } +#endif str[0] = (Py_UNICODE) code; - return PyUnicode_FromUnicode(str, 1); + return PyUnicode_FromUnicode(str, 1); } /* XXX Add doc strings. */