]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46659: Fix the MBCS codec alias on Windows (GH-31218)
authorVictor Stinner <vstinner@python.org>
Tue, 22 Feb 2022 21:04:07 +0000 (22:04 +0100)
committerGitHub <noreply@github.com>
Tue, 22 Feb 2022 21:04:07 +0000 (22:04 +0100)
Lib/encodings/__init__.py
Lib/test/test_codecs.py

index dff22a4b27f45221a43bef91ac9ba2bffd9e294d..f9075b8f0d98acf23cbf61ae62f4881aa5d15f79 100644 (file)
@@ -152,7 +152,14 @@ def search_function(encoding):
     # Return the registry entry
     return entry
 
+# Register the search_function in the Python codec registry
+codecs.register(search_function)
+
 if sys.platform == 'win32':
+    # bpo-671666, bpo-46668: If Python does not implement a codec for current
+    # Windows ANSI code page, use the "mbcs" codec instead:
+    # WideCharToMultiByte() and MultiByteToWideChar() functions with CP_ACP.
+    # Python does not support custom code pages.
     def _alias_mbcs(encoding):
         try:
             import _winapi
@@ -164,8 +171,4 @@ if sys.platform == 'win32':
             # Imports may fail while we are shutting down
             pass
 
-    # It must be registered before search_function()
     codecs.register(_alias_mbcs)
-
-# Register the search_function in the Python codec registry
-codecs.register(search_function)
index d30ff8f82db9a5d5a1a54e3044a7ac003d60ef95..8118ec6f4727b8ed581fa15db5c08618101c9f85 100644 (file)
@@ -3191,13 +3191,16 @@ class CodePageTest(unittest.TestCase):
         self.assertEqual(decoded, ('abc', 3))
 
     def test_mbcs_alias(self):
-        # On Windows, the encoding name must be the ANSI code page
-        encoding = locale.getpreferredencoding(False)
-        self.assertTrue(encoding.startswith('cp'), encoding)
-
-        # The encodings module create a "mbcs" alias to the ANSI code page
-        codec = codecs.lookup(encoding)
-        self.assertEqual(codec.name, "mbcs")
+        # Check that looking up our 'default' codepage will return
+        # mbcs when we don't have a more specific one available
+        code_page = 99_999
+        name = f'cp{code_page}'
+        with mock.patch('_winapi.GetACP', return_value=code_page):
+            try:
+                codec = codecs.lookup(name)
+                self.assertEqual(codec.name, 'mbcs')
+            finally:
+                codecs.unregister(name)
 
     @support.bigmemtest(size=2**31, memuse=7, dry_run=False)
     def test_large_input(self, size):