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.
This commit is contained in:
Antoine Pitrou 2011-10-22 21:26:01 +02:00
parent f678e82240
commit 5a77fe92bd
4 changed files with 31 additions and 5 deletions

View File

@ -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

View File

@ -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'):

View File

@ -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

View File

@ -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;