Merged revisions 78123 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r78123 | antoine.pitrou | 2010-02-09 17:51:16 +0100 (mar., 09 févr. 2010) | 5 lines

  Issue #6233: ElementTree failed converting unicode characters to XML
  entities when they could't be represented in the requested output
  encoding.  Patch by Jerry Chen.
........
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index cfac4f7..c47573e 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -662,9 +662,9 @@
         # write XML to file
         tag = node.tag
         if tag is Comment:
-            file.write(_encode("<!-- %s -->" % _escape_cdata(node.text), encoding))
+            file.write(b"<!-- " + _encode_cdata(node.text, encoding) + b" -->")
         elif tag is ProcessingInstruction:
-            file.write(_encode("<?%s?>" % _escape_cdata(node.text), encoding))
+            file.write(b"<?" + _encode_cdata(node.text, encoding) + b"?>")
         else:
             items = list(node.items())
             xmlns_items = [] # new namespaces in this scope
@@ -696,7 +696,7 @@
             if node.text or len(node):
                 file.write(_encode(">", encoding))
                 if node.text:
-                    file.write(_encode(_escape_cdata(node.text), encoding))
+                    file.write(_encode_cdata(node.text, encoding))
                 for n in node:
                     self._write(file, n, encoding, namespaces)
                 file.write(_encode("</" + tag + ">", encoding))
@@ -705,7 +705,7 @@
             for k, v in xmlns_items:
                 del namespaces[v]
         if node.tail:
-            file.write(_encode(_escape_cdata(node.tail), encoding))
+            file.write(_encode_cdata(node.tail, encoding))
 
 # --------------------------------------------------------------------
 # helpers
@@ -788,13 +788,16 @@
 # the following functions assume an ascii-compatible encoding
 # (or "utf-16")
 
-def _escape_cdata(text):
+def _encode_cdata(text, encoding):
     # escape character data
     try:
         text = text.replace("&", "&amp;")
         text = text.replace("<", "&lt;")
         text = text.replace(">", "&gt;")
-        return text
+        if encoding:
+            return text.encode(encoding, "xmlcharrefreplace")
+        else:
+            return text
     except (TypeError, AttributeError):
         _raise_serialization_error(text)