summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_codeccallbacks.py38
-rw-r--r--Python/exceptions.c26
2 files changed, 56 insertions, 8 deletions
diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py
index 134d86c..4552462 100644
--- a/Lib/test/test_codeccallbacks.py
+++ b/Lib/test/test_codeccallbacks.py
@@ -258,7 +258,7 @@ class CodecCallbackTest(unittest.TestCase):
self.check_exceptionobjectargs(
UnicodeEncodeError,
["ascii", u"g\xfcrk", 1, 2, "ouch"],
- "'ascii' codec can't encode character '\ufc' in position 1: ouch"
+ "'ascii' codec can't encode character '\\xfc' in position 1: ouch"
)
self.check_exceptionobjectargs(
UnicodeEncodeError,
@@ -268,8 +268,24 @@ class CodecCallbackTest(unittest.TestCase):
self.check_exceptionobjectargs(
UnicodeEncodeError,
["ascii", u"\xfcx", 0, 1, "ouch"],
- "'ascii' codec can't encode character '\ufc' in position 0: ouch"
+ "'ascii' codec can't encode character '\\xfc' in position 0: ouch"
)
+ self.check_exceptionobjectargs(
+ UnicodeEncodeError,
+ ["ascii", u"\u0100x", 0, 1, "ouch"],
+ "'ascii' codec can't encode character '\\u0100' in position 0: ouch"
+ )
+ self.check_exceptionobjectargs(
+ UnicodeEncodeError,
+ ["ascii", u"\uffffx", 0, 1, "ouch"],
+ "'ascii' codec can't encode character '\\uffff' in position 0: ouch"
+ )
+ if sys.maxunicode > 0xffff:
+ self.check_exceptionobjectargs(
+ UnicodeEncodeError,
+ ["ascii", u"\U00010000x", 0, 1, "ouch"],
+ "'ascii' codec can't encode character '\\U00010000' in position 0: ouch"
+ )
def test_unicodedecodeerror(self):
self.check_exceptionobjectargs(
@@ -287,10 +303,26 @@ class CodecCallbackTest(unittest.TestCase):
self.check_exceptionobjectargs(
UnicodeTranslateError,
[u"g\xfcrk", 1, 2, "ouch"],
- "can't translate character '\\ufc' in position 1: ouch"
+ "can't translate character '\\xfc' in position 1: ouch"
)
self.check_exceptionobjectargs(
UnicodeTranslateError,
+ [u"g\u0100rk", 1, 2, "ouch"],
+ "can't translate character '\\u0100' in position 1: ouch"
+ )
+ self.check_exceptionobjectargs(
+ UnicodeTranslateError,
+ [u"g\uffffrk", 1, 2, "ouch"],
+ "can't translate character '\\uffff' in position 1: ouch"
+ )
+ if sys.maxunicode > 0xffff:
+ self.check_exceptionobjectargs(
+ UnicodeTranslateError,
+ [u"g\U00010000rk", 1, 2, "ouch"],
+ "can't translate character '\\U00010000' in position 1: ouch"
+ )
+ self.check_exceptionobjectargs(
+ UnicodeTranslateError,
[u"g\xfcrk", 1, 3, "ouch"],
"can't translate characters in position 1-2: ouch"
)
diff --git a/Python/exceptions.c b/Python/exceptions.c
index f8e330f..d49b364 100644
--- a/Python/exceptions.c
+++ b/Python/exceptions.c
@@ -1251,10 +1251,18 @@ UnicodeEncodeError__str__(PyObject *self, PyObject *arg)
goto error;
if (end==start+1) {
+ int badchar = (int)PyUnicode_AS_UNICODE(objectObj)[start];
+ char *format;
+ if (badchar <= 0xff)
+ format = "'%.400s' codec can't encode character '\\x%02x' in position %d: %.400s";
+ else if (badchar <= 0xffff)
+ format = "'%.400s' codec can't encode character '\\u%04x' in position %d: %.400s";
+ else
+ format = "'%.400s' codec can't encode character '\\U%08x' in position %d: %.400s";
PyOS_snprintf(buffer, sizeof(buffer),
- "'%.400s' codec can't encode character '\\u%x' in position %d: %.400s",
+ format,
PyString_AS_STRING(encodingObj),
- (int)PyUnicode_AS_UNICODE(objectObj)[start],
+ badchar,
start,
PyString_AS_STRING(reasonObj)
);
@@ -1329,7 +1337,7 @@ UnicodeDecodeError__str__(PyObject *self, PyObject *arg)
if (end==start+1) {
PyOS_snprintf(buffer, sizeof(buffer),
- "'%.400s' codec can't decode byte 0x%x in position %d: %.400s",
+ "'%.400s' codec can't decode byte 0x%02x in position %d: %.400s",
PyString_AS_STRING(encodingObj),
((int)PyString_AS_STRING(objectObj)[start])&0xff,
start,
@@ -1438,9 +1446,17 @@ UnicodeTranslateError__str__(PyObject *self, PyObject *arg)
goto error;
if (end==start+1) {
+ int badchar = (int)PyUnicode_AS_UNICODE(objectObj)[start];
+ char *format;
+ if (badchar <= 0xff)
+ format = "can't translate character '\\x%02x' in position %d: %.400s";
+ else if (badchar <= 0xffff)
+ format = "can't translate character '\\u%04x' in position %d: %.400s";
+ else
+ format = "can't translate character '\\U%08x' in position %d: %.400s";
PyOS_snprintf(buffer, sizeof(buffer),
- "can't translate character '\\u%x' in position %d: %.400s",
- (int)PyUnicode_AS_UNICODE(objectObj)[start],
+ format,
+ badchar,
start,
PyString_AS_STRING(reasonObj)
);