]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-104783: locale.getencoding() fallback uses FS encoding (#105381)
authorVictor Stinner <vstinner@python.org>
Tue, 6 Jun 2023 14:55:21 +0000 (16:55 +0200)
committerGitHub <noreply@github.com>
Tue, 6 Jun 2023 14:55:21 +0000 (16:55 +0200)
The locale.getencoding() function now uses
sys.getfilesystemencoding() if _locale.getencoding() is missing,
instead of calling locale.getdefaultlocale().

Lib/locale.py
Lib/test/test_locale.py

index 019796730071a58e02333ae4427b406ee5d3495b..cd52ecd28f438f7d23cf91df259c8a5f630d8b74 100644 (file)
@@ -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
index b0d7998559759efedc7563f9390e28738820529f..da4bd79746a476e0c3240d8844333cac4d6eaad2 100644 (file)
@@ -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 @@ class TestMiscellaneous(unittest.TestCase):
         # 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()