Commit c13f83ef authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #1548891: The cStringIO.StringIO() constructor now encodes unicode

arguments with the system default encoding just like the write() method
does, instead of converting it to a raw buffer.
parent d11c4643
......@@ -82,10 +82,7 @@ instead.
those cases.
Unlike the :mod:`StringIO` module, this module is not able to accept Unicode
strings that cannot be encoded as plain ASCII strings. Calling
:func:`StringIO` with a Unicode string parameter populates the object with
the buffer representation of the Unicode string instead of encoding the
string.
strings that cannot be encoded as plain ASCII strings.
Another difference from the :mod:`StringIO` module is that calling
:func:`StringIO` with a string parameter creates a read-only object. Unlike an
......
......@@ -134,6 +134,27 @@ class TestcStringIO(TestGenericStringIO):
f = self.MODULE.StringIO(a)
self.assertEqual(f.getvalue(), '\x00\x01\x02')
def test_unicode(self):
if not test_support.have_unicode: return
# The cStringIO module converts Unicode strings to character
# strings when writing them to cStringIO objects.
# Check that this works.
f = self.MODULE.StringIO()
f.write(u'abcde')
s = f.getvalue()
self.assertEqual(s, 'abcde')
self.assertEqual(type(s), str)
f = self.MODULE.StringIO(u'abcde')
s = f.getvalue()
self.assertEqual(s, 'abcde')
self.assertEqual(type(s), str)
self.assertRaises(UnicodeEncodeError, self.MODULE.StringIO, u'\xf4')
import sys
if sys.platform.startswith('java'):
......
......@@ -66,6 +66,10 @@ Core and Builtins
Library
-------
- Issue #1548891: The cStringIO.StringIO() constructor now encodes unicode
arguments with the system default encoding just like the write() method
does, instead of converting it to a raw buffer.
- Issue #9168: now smtpd is able to bind privileged port.
- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and
......
......@@ -661,7 +661,11 @@ newIobject(PyObject *s) {
char *buf;
Py_ssize_t size;
if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
if (PyUnicode_Check(s)) {
if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0)
return NULL;
}
else if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) {
PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found",
s->ob_type->tp_name);
return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment