Skip to content

Commit

Permalink
pythongh-104783: locale.getencoding() fallback uses FS encoding
Browse files Browse the repository at this point in the history
The locale.getencoding() function now uses
sys.getfilesystemencoding() if _locale.getencoding() is missing,
instead of calling locale.getdefaultlocale().
  • Loading branch information
vstinner committed Jun 6, 2023
1 parent 0cb6b9b commit 13a71f6
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
14 changes: 5 additions & 9 deletions Lib/locale.py
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions 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
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit 13a71f6

Please sign in to comment.