Issue #10329: The trace module writes reports using the input Python script
encoding, instead of the locale encoding. Patch written by Alexander
Belopolsky.
diff --git a/Lib/trace.py b/Lib/trace.py
index b24d193..d460cf2 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -330,9 +330,10 @@
 
             source = linecache.getlines(filename)
             coverpath = os.path.join(dir, modulename + ".cover")
+            with open(filename, 'rb') as fp:
+                encoding, _ = tokenize.detect_encoding(fp.readline)
             n_hits, n_lines = self.write_results_file(coverpath, source,
-                                                      lnotab, count)
-
+                                                      lnotab, count, encoding)
             if summary and n_lines:
                 percent = int(100 * n_hits / n_lines)
                 sums[modulename] = n_lines, percent, modulename, filename
@@ -351,11 +352,11 @@
             except IOError as err:
                 print("Can't save counts files because %s" % err, file=sys.stderr)
 
-    def write_results_file(self, path, lines, lnotab, lines_hit):
+    def write_results_file(self, path, lines, lnotab, lines_hit, encoding=None):
         """Return a coverage results file in path."""
 
         try:
-            outfile = open(path, "w")
+            outfile = open(path, "w", encoding=encoding)
         except IOError as err:
             print(("trace: Could not open %r for writing: %s"
                                   "- skipping" % (path, err)), file=sys.stderr)