diff --git a/Lib/xml/etree/ElementInclude.py b/Lib/xml/etree/ElementInclude.py index 84fd7548b28..6cc1b44e958 100644 --- a/Lib/xml/etree/ElementInclude.py +++ b/Lib/xml/etree/ElementInclude.py @@ -67,7 +67,7 @@ class FatalIncludeError(SyntaxError): # # @param href Resource reference. # @param parse Parse mode. Either "xml" or "text". -# @param encoding Optional text encoding. +# @param encoding Optional text encoding (UTF-8 by default for "text"). # @return The expanded resource. If the parse mode is "xml", this # is an ElementTree instance. If the parse mode is "text", this # is a Unicode string. If the loader fails, it can return None @@ -75,13 +75,14 @@ class FatalIncludeError(SyntaxError): # @throws IOError If the loader fails to load the resource. def default_loader(href, parse, encoding=None): - file = open(href) if parse == "xml": + file = open(href, 'rb') data = ElementTree.parse(file).getroot() else: + if not encoding: + encoding = 'UTF-8' + file = open(href, 'r', encoding=encoding) data = file.read() - if encoding: - data = data.decode(encoding) file.close() return data diff --git a/Misc/NEWS b/Misc/NEWS index 34f6b3d71ad..f315c57b13c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -200,6 +200,11 @@ Core and Builtins Library ------- +- Issue #12451: The XInclude default loader of xml.etree now decodes files from + UTF-8 instead of the locale encoding if the encoding is not specified. It now + also opens XML files for the parser in binary mode instead of the text mode + to avoid encoding issues. + - Issue #12451: doctest.debug_script() doesn't create a temporary file anymore to avoid encoding issues.