diff --git a/Lib/io.py b/Lib/io.py index 96226e4fdbc..9a4f9561d0e 100644 --- a/Lib/io.py +++ b/Lib/io.py @@ -1262,11 +1262,13 @@ class StringIO(TextIOWrapper): # XXX This is really slow, but fully functional - def __init__(self, initial_value=""): - super(StringIO, self).__init__(BytesIO(), "utf-8") + def __init__(self, initial_value="", encoding="utf-8", newline=None): + super(StringIO, self).__init__(BytesIO(), + encoding=encoding, + newline=newline) if initial_value: self.write(initial_value) self.seek(0) def getvalue(self): - return self.buffer.getvalue().decode("utf-8") + return self.buffer.getvalue().decode(self._encoding) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 9b61d1a2fec..cc637d023a6 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -869,17 +869,17 @@ class MinidomTest(unittest.TestCase): def testEncodings(self): doc = parseString('') - self.confirm(doc.toxml() == '\u20ac' - and doc.toxml('utf-8') == - '\xe2\x82\xac' - and doc.toxml('iso-8859-15') == - '\xa4', - "testEncodings - encoding EURO SIGN") + self.assertEqual(doc.toxml(), + '\u20ac') + self.assertEqual(doc.toxml('utf-8'), + b'\xe2\x82\xac') + self.assertEqual(doc.toxml('iso-8859-15'), + b'\xa4') # Verify that character decoding errors throw exceptions instead # of crashing self.assertRaises(UnicodeDecodeError, parseString, - 'Comment \xe7a va ? Tr\xe8s bien ?') + b'Comment \xe7a va ? Tr\xe8s bien ?') doc.unlink() diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 3529bd33ef0..d380022c952 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -14,6 +14,7 @@ Todo: * SAX 2 namespaces """ +import io import xml.dom from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg @@ -44,20 +45,19 @@ class Node(xml.dom.Node): def toxml(self, encoding = None): return self.toprettyxml("", "", encoding) - def toprettyxml(self, indent="\t", newl="\n", encoding = None): + def toprettyxml(self, indent="\t", newl="\n", encoding=None): # indent = the indentation string to prepend, per level # newl = the newline string to append - writer = _get_StringIO() - if encoding is not None: - import codecs - # Can't use codecs.getwriter to preserve 2.0 compatibility - writer = codecs.lookup(encoding)[3](writer) + writer = io.StringIO(encoding=encoding) if self.nodeType == Node.DOCUMENT_NODE: # Can pass encoding only to document, to put it into XML header self.writexml(writer, "", indent, newl, encoding) else: self.writexml(writer, "", indent, newl) - return writer.getvalue() + if encoding is None: + return writer.getvalue() + else: + return writer.buffer.getvalue() def hasChildNodes(self): if self.childNodes: @@ -360,7 +360,7 @@ class Attr(Node): def _get_localName(self): if 'localName' in self.__dict__: - return self.__dict__['localName'] + return self.__dict__['localName'] return self.nodeName.split(":", 1)[-1] def _get_name(self): @@ -665,7 +665,7 @@ class Element(Node): def _get_localName(self): if 'localName' in self.__dict__: - return self.__dict__['localName'] + return self.__dict__['localName'] return self.tagName.split(":", 1)[-1] def _get_tagName(self): @@ -1897,11 +1897,6 @@ def _nssplit(qualifiedName): return (None, fields[0]) -def _get_StringIO(): - # we can't use cStringIO since it doesn't support Unicode strings - from StringIO import StringIO - return StringIO() - def _do_pulldom_parse(func, args, kwargs): events = func(*args, **kwargs) toktype, rootNode = events.getEvent()