[Python-checkins] gh-104783: locale.getencoding() fallback uses FS encoding (#105381)

vstinner webhook-mailer at python.org
Tue Jun 6 10:55:29 EDT 2023


https://github.com/python/cpython/commit/b1a91d26c67250ff7abeb20064e7766096604001
commit: b1a91d26c67250ff7abeb20064e7766096604001
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2023-06-06T16:55:21+02:00
summary:

gh-104783: locale.getencoding() fallback uses FS encoding (#105381)

The locale.getencoding() function now uses
sys.getfilesystemencoding() if _locale.getencoding() is missing,
instead of calling locale.getdefaultlocale().

files:
M Lib/locale.py
M Lib/test/test_locale.py

diff --git a/Lib/locale.py b/Lib/locale.py
index 019796730071..cd52ecd28f43 100644
--- a/Lib/locale.py
+++ b/Lib/locale.py
@@ -616,16 +616,12 @@ def setlocale(category, locale=None):
 try:
     from _locale import getencoding
 except ImportError:
+    # When _locale.getencoding() is missing, locale.getencoding() uses the
+    # Python filesystem encoding.
+    _encoding = sys.getfilesystemencoding()
     def getencoding():
-        if hasattr(sys, 'getandroidapilevel'):
-            # On Android langinfo.h and CODESET are missing, and UTF-8 is
-            # always used in mbstowcs() and wcstombs().
-            return 'utf-8'
-        encoding = _getdefaultlocale()[1]
-        if encoding is None:
-            # LANG not set, default to UTF-8
-            encoding = 'utf-8'
-        return encoding
+        return _encoding
+
 
 try:
     CODESET
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
index b0d799855975..da4bd79746a4 100644
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -1,6 +1,8 @@
 from decimal import Decimal
 from test.support import verbose, is_android, is_emscripten, is_wasi
 from test.support.warnings_helper import check_warnings
+from test.support.import_helper import import_fresh_module
+from unittest import mock
 import unittest
 import locale
 import sys
@@ -523,6 +525,15 @@ def test_getencoding(self):
         # make sure it is valid
         codecs.lookup(enc)
 
+    def test_getencoding_fallback(self):
+        # When _locale.getencoding() is missing, locale.getencoding() uses
+        # the Python filesystem
+        encoding = 'FALLBACK_ENCODING'
+        with mock.patch.object(sys, 'getfilesystemencoding',
+                               return_value=encoding):
+            locale_fallback = import_fresh_module('locale', blocked=['_locale'])
+            self.assertEqual(locale_fallback.getencoding(), encoding)
+
     def test_getpreferredencoding(self):
         # Invoke getpreferredencoding to make sure it does not cause exceptions.
         enc = locale.getpreferredencoding()



More information about the Python-checkins mailing list