mirror of
https://github.com/python/cpython.git
synced 2025-09-27 18:59:43 +00:00
bpo-18378: Recognize "UTF-8" as a valid name in locale._parse_localename (GH-14736)
This commit is contained in:
parent
fa220ec763
commit
b0caf32981
3 changed files with 41 additions and 0 deletions
|
@ -492,6 +492,10 @@ def _parse_localename(localename):
|
||||||
return tuple(code.split('.')[:2])
|
return tuple(code.split('.')[:2])
|
||||||
elif code == 'C':
|
elif code == 'C':
|
||||||
return None, None
|
return None, None
|
||||||
|
elif code == 'UTF-8':
|
||||||
|
# On macOS "LC_CTYPE=UTF-8" is a valid locale setting
|
||||||
|
# for getting UTF-8 handling for text.
|
||||||
|
return None, 'UTF-8'
|
||||||
raise ValueError('unknown locale: %s' % localename)
|
raise ValueError('unknown locale: %s' % localename)
|
||||||
|
|
||||||
def _build_localename(localetuple):
|
def _build_localename(localetuple):
|
||||||
|
|
|
@ -493,6 +493,42 @@ class NormalizeTest(unittest.TestCase):
|
||||||
|
|
||||||
|
|
||||||
class TestMiscellaneous(unittest.TestCase):
|
class TestMiscellaneous(unittest.TestCase):
|
||||||
|
def test_defaults_UTF8(self):
|
||||||
|
# Issue #18378: on (at least) macOS setting LC_CTYPE to "UTF-8" is
|
||||||
|
# valid. Futhermore LC_CTYPE=UTF is used by the UTF-8 locale coercing
|
||||||
|
# during interpreter startup (on macOS).
|
||||||
|
import _locale
|
||||||
|
import os
|
||||||
|
|
||||||
|
self.assertEqual(locale._parse_localename('UTF-8'), (None, 'UTF-8'))
|
||||||
|
|
||||||
|
if hasattr(_locale, '_getdefaultlocale'):
|
||||||
|
orig_getlocale = _locale._getdefaultlocale
|
||||||
|
del _locale._getdefaultlocale
|
||||||
|
else:
|
||||||
|
orig_getlocale = None
|
||||||
|
|
||||||
|
orig_env = {}
|
||||||
|
try:
|
||||||
|
for key in ('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE'):
|
||||||
|
if key in os.environ:
|
||||||
|
orig_env[key] = os.environ[key]
|
||||||
|
del os.environ[key]
|
||||||
|
|
||||||
|
os.environ['LC_CTYPE'] = 'UTF-8'
|
||||||
|
|
||||||
|
self.assertEqual(locale.getdefaultlocale(), (None, 'UTF-8'))
|
||||||
|
|
||||||
|
finally:
|
||||||
|
for k in orig_env:
|
||||||
|
os.environ[k] = orig_env[k]
|
||||||
|
|
||||||
|
if 'LC_CTYPE' not in orig_env:
|
||||||
|
del os.environ['LC_CTYPE']
|
||||||
|
|
||||||
|
if orig_getlocale is not None:
|
||||||
|
_locale._getdefaultlocale = orig_getlocale
|
||||||
|
|
||||||
def test_getpreferredencoding(self):
|
def test_getpreferredencoding(self):
|
||||||
# Invoke getpreferredencoding to make sure it does not cause exceptions.
|
# Invoke getpreferredencoding to make sure it does not cause exceptions.
|
||||||
enc = locale.getpreferredencoding()
|
enc = locale.getpreferredencoding()
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Recognize "UTF-8" as a valid value for LC_CTYPE in locale._parse_localename.
|
Loading…
Add table
Add a link
Reference in a new issue