[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