diff -r 80f0c7d5deda Lib/test/test_sax.py --- a/Lib/test/test_sax.py Sat Dec 08 22:45:09 2012 -0500 +++ b/Lib/test/test_sax.py Sun Dec 09 14:16:43 2012 +0200 @@ -14,6 +14,10 @@ from xml.sax.handler import feature_namespaces from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl from cStringIO import StringIO +import os +import shutil +import sys +import test.test_support as support from test.test_support import findfile, run_unittest import unittest @@ -384,6 +388,20 @@ self.assertEqual(result.getvalue(), xml_test_out) + def test_expat_file_unicode(self): + fname = support.TESTFN_UNICODE + shutil.copyfile(TEST_XMLFILE, fname) + self.addCleanup(os.remove, fname) + + parser = create_parser() + result = StringIO() + xmlgen = XMLGenerator(result) + + parser.setContentHandler(xmlgen) + parser.parse(open(fname)) + + self.assertEqual(result.getvalue(), xml_test_out) + # ===== DTDHandler support class TestDTDHandler: @@ -523,6 +541,20 @@ self.assertEqual(result.getvalue(), xml_test_out) + def test_expat_inpsource_sysid_unicode(self): + fname = support.TESTFN_UNICODE + shutil.copyfile(TEST_XMLFILE, fname) + self.addCleanup(os.remove, fname) + + parser = create_parser() + result = StringIO() + xmlgen = XMLGenerator(result) + + parser.setContentHandler(xmlgen) + parser.parse(InputSource(fname)) + + self.assertEqual(result.getvalue(), xml_test_out) + def test_expat_inpsource_stream(self): parser = create_parser() result = StringIO() @@ -596,6 +628,21 @@ self.assertEqual(parser.getSystemId(), TEST_XMLFILE) self.assertEqual(parser.getPublicId(), None) + def test_expat_locator_withinfo_unicode(self): + fname = support.TESTFN_UNICODE + shutil.copyfile(TEST_XMLFILE, fname) + self.addCleanup(os.remove, fname) + + result = StringIO() + xmlgen = XMLGenerator(result) + parser = create_parser() + parser.setContentHandler(xmlgen) + parser.parse(fname) + + self.assertEqual(parser.getSystemId(), + fname.encode(sys.getfilesystemencoding())) + self.assertEqual(parser.getPublicId(), None) + # =========================================================================== # diff -r 80f0c7d5deda Lib/xml/sax/saxutils.py --- a/Lib/xml/sax/saxutils.py Sat Dec 08 22:45:09 2012 -0500 +++ b/Lib/xml/sax/saxutils.py Sun Dec 09 14:16:43 2012 +0200 @@ -4,6 +4,7 @@ """ import os, urlparse, urllib, types +import sys import handler import xmlreader @@ -284,13 +285,18 @@ returns a fully resolved InputSource object ready for reading.""" if type(source) in _StringTypes: + if isinstance(source, unicode): + source = source.encode(sys.getfilesystemencoding()) source = xmlreader.InputSource(source) elif hasattr(source, "read"): f = source source = xmlreader.InputSource() source.setByteStream(f) if hasattr(f, "name"): - source.setSystemId(f.name) + fname = f.name + if isinstance(fname, unicode): + fname = fname.encode(sys.getfilesystemencoding()) + source.setSystemId(fname) if source.getByteStream() is None: sysid = source.getSystemId() diff -r 80f0c7d5deda Lib/xml/sax/xmlreader.py --- a/Lib/xml/sax/xmlreader.py Sat Dec 08 22:45:09 2012 -0500 +++ b/Lib/xml/sax/xmlreader.py Sun Dec 09 14:16:43 2012 +0200 @@ -2,6 +2,7 @@ should be based on this code. """ import handler +import sys from _exceptions import SAXNotSupportedException, SAXNotRecognizedException @@ -201,6 +202,8 @@ application, although it may make copies and modify those.""" def __init__(self, system_id = None): + if isinstance(system_id, unicode): + system_id = system_id.encode(sys.getfilesystemencoding()) self.__system_id = system_id self.__public_id = None self.__encoding = None