bpo-44666: Use default encoding as fallback for compile_file (GH-27236) (GH-27488)

When sys.stdout.encoding is None compile_file will fall back to
sys.getdefaultencoding to encode/decode error messages.

Co-authored-by: Stefan Hoelzl <stefan.hoelzl@posteo.de>
Co-authored-by: Mickaƫl Schoentgen <contact@tiger-222.fr>
(cherry picked from commit 80f07076294bc09a55ed76d9bbf307404eef25e6)
diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py
index 96a0f8f..4612953 100644
--- a/Lib/test/test_compileall.py
+++ b/Lib/test/test_compileall.py
@@ -169,6 +169,14 @@ def test_no_pycache_in_non_package(self):
         compileall.compile_file(data_file)
         self.assertFalse(os.path.exists(os.path.join(data_dir, '__pycache__')))
 
+
+    def test_compile_file_encoding_fallback(self):
+        # Bug 44666 reported that compile_file failed when sys.stdout.encoding is None
+        self.add_bad_source_file()
+        with contextlib.redirect_stdout(io.StringIO()):
+            self.assertFalse(compileall.compile_file(self.bad_source_path))
+
+
     def test_optimize(self):
         # make sure compiling with different optimization settings than the
         # interpreter's creates the correct file names