mirror of https://github.com/python/cpython
bpo-46659: Fix the MBCS codec alias on Windows (GH-31218)
This commit is contained in:
parent
8fb94893e4
commit
ccbe8045fa
|
@ -152,7 +152,14 @@ def search_function(encoding):
|
||||||
# Return the registry entry
|
# Return the registry entry
|
||||||
return entry
|
return entry
|
||||||
|
|
||||||
|
# Register the search_function in the Python codec registry
|
||||||
|
codecs.register(search_function)
|
||||||
|
|
||||||
if sys.platform == 'win32':
|
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):
|
def _alias_mbcs(encoding):
|
||||||
try:
|
try:
|
||||||
import _winapi
|
import _winapi
|
||||||
|
@ -164,8 +171,4 @@ if sys.platform == 'win32':
|
||||||
# Imports may fail while we are shutting down
|
# Imports may fail while we are shutting down
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# It must be registered before search_function()
|
|
||||||
codecs.register(_alias_mbcs)
|
codecs.register(_alias_mbcs)
|
||||||
|
|
||||||
# Register the search_function in the Python codec registry
|
|
||||||
codecs.register(search_function)
|
|
||||||
|
|
|
@ -3191,13 +3191,16 @@ class CodePageTest(unittest.TestCase):
|
||||||
self.assertEqual(decoded, ('abc', 3))
|
self.assertEqual(decoded, ('abc', 3))
|
||||||
|
|
||||||
def test_mbcs_alias(self):
|
def test_mbcs_alias(self):
|
||||||
# On Windows, the encoding name must be the ANSI code page
|
# Check that looking up our 'default' codepage will return
|
||||||
encoding = locale.getpreferredencoding(False)
|
# mbcs when we don't have a more specific one available
|
||||||
self.assertTrue(encoding.startswith('cp'), encoding)
|
code_page = 99_999
|
||||||
|
name = f'cp{code_page}'
|
||||||
# The encodings module create a "mbcs" alias to the ANSI code page
|
with mock.patch('_winapi.GetACP', return_value=code_page):
|
||||||
codec = codecs.lookup(encoding)
|
try:
|
||||||
self.assertEqual(codec.name, "mbcs")
|
codec = codecs.lookup(name)
|
||||||
|
self.assertEqual(codec.name, 'mbcs')
|
||||||
|
finally:
|
||||||
|
codecs.unregister(name)
|
||||||
|
|
||||||
@support.bigmemtest(size=2**31, memuse=7, dry_run=False)
|
@support.bigmemtest(size=2**31, memuse=7, dry_run=False)
|
||||||
def test_large_input(self, size):
|
def test_large_input(self, size):
|
||||||
|
|
Loading…
Reference in New Issue