@@ -493,6 +493,42 @@ def test_japanese(self):
493493
494494
495495class TestMiscellaneous (unittest .TestCase ):
496+ def test_defaults_UTF8 (self ):
497+ # Issue #18378: on (at least) macOS setting LC_CTYPE to "UTF-8" is
498+ # valid. Futhermore LC_CTYPE=UTF is used by the UTF-8 locale coercing
499+ # during interpreter startup (on macOS).
500+ import _locale
501+ import os
502+
503+ self .assertEqual (locale ._parse_localename ('UTF-8' ), (None , 'UTF-8' ))
504+
505+ if hasattr (_locale , '_getdefaultlocale' ):
506+ orig_getlocale = _locale ._getdefaultlocale
507+ del _locale ._getdefaultlocale
508+ else :
509+ orig_getlocale = None
510+
511+ orig_env = {}
512+ try :
513+ for key in ('LC_ALL' , 'LC_CTYPE' , 'LANG' , 'LANGUAGE' ):
514+ if key in os .environ :
515+ orig_env [key ] = os .environ [key ]
516+ del os .environ [key ]
517+
518+ os .environ ['LC_CTYPE' ] = 'UTF-8'
519+
520+ self .assertEqual (locale .getdefaultlocale (), (None , 'UTF-8' ))
521+
522+ finally :
523+ for k in orig_env :
524+ os .environ [k ] = orig_env [k ]
525+
526+ if 'LC_CTYPE' not in orig_env :
527+ del os .environ ['LC_CTYPE' ]
528+
529+ if orig_getlocale is not None :
530+ _locale ._getdefaultlocale = orig_getlocale
531+
496532 def test_getpreferredencoding (self ):
497533 # Invoke getpreferredencoding to make sure it does not cause exceptions.
498534 enc = locale .getpreferredencoding ()
0 commit comments