mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-47000: Add locale.getencoding()
(GH-32068)
This commit is contained in:
parent
cd29bd13ef
commit
6773203487
11 changed files with 88 additions and 46 deletions
|
@ -28,7 +28,7 @@ __all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error",
|
|||
"setlocale", "resetlocale", "localeconv", "strcoll", "strxfrm",
|
||||
"str", "atof", "atoi", "format", "format_string", "currency",
|
||||
"normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY",
|
||||
"LC_NUMERIC", "LC_ALL", "CHAR_MAX"]
|
||||
"LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding"]
|
||||
|
||||
def _strcoll(a,b):
|
||||
""" strcoll(string,string) -> int.
|
||||
|
@ -637,19 +637,17 @@ def resetlocale(category=LC_ALL):
|
|||
|
||||
|
||||
try:
|
||||
from _locale import _get_locale_encoding
|
||||
from _locale import getencoding
|
||||
except ImportError:
|
||||
def _get_locale_encoding():
|
||||
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'
|
||||
if sys.flags.utf8_mode:
|
||||
return 'UTF-8'
|
||||
return 'utf-8'
|
||||
encoding = getdefaultlocale()[1]
|
||||
if encoding is None:
|
||||
# LANG not set, default conservatively to ASCII
|
||||
encoding = 'ascii'
|
||||
# LANG not set, default to UTF-8
|
||||
encoding = 'utf-8'
|
||||
return encoding
|
||||
|
||||
try:
|
||||
|
@ -657,17 +655,19 @@ try:
|
|||
except NameError:
|
||||
def getpreferredencoding(do_setlocale=True):
|
||||
"""Return the charset that the user is likely using."""
|
||||
return _get_locale_encoding()
|
||||
if sys.flags.utf8_mode:
|
||||
return 'utf-8'
|
||||
return getencoding()
|
||||
else:
|
||||
# On Unix, if CODESET is available, use that.
|
||||
def getpreferredencoding(do_setlocale=True):
|
||||
"""Return the charset that the user is likely using,
|
||||
according to the system configuration."""
|
||||
if sys.flags.utf8_mode:
|
||||
return 'UTF-8'
|
||||
return 'utf-8'
|
||||
|
||||
if not do_setlocale:
|
||||
return _get_locale_encoding()
|
||||
return getencoding()
|
||||
|
||||
old_loc = setlocale(LC_CTYPE)
|
||||
try:
|
||||
|
@ -675,7 +675,7 @@ else:
|
|||
setlocale(LC_CTYPE, "")
|
||||
except Error:
|
||||
pass
|
||||
return _get_locale_encoding()
|
||||
return getencoding()
|
||||
finally:
|
||||
setlocale(LC_CTYPE, old_loc)
|
||||
|
||||
|
|
|
@ -203,12 +203,12 @@ class UTF8ModeTests(unittest.TestCase):
|
|||
def test_locale_getpreferredencoding(self):
|
||||
code = 'import locale; print(locale.getpreferredencoding(False), locale.getpreferredencoding(True))'
|
||||
out = self.get_output('-X', 'utf8', '-c', code)
|
||||
self.assertEqual(out, 'UTF-8 UTF-8')
|
||||
self.assertEqual(out, 'utf-8 utf-8')
|
||||
|
||||
for loc in POSIX_LOCALES:
|
||||
with self.subTest(LC_ALL=loc):
|
||||
out = self.get_output('-X', 'utf8', '-c', code, LC_ALL=loc)
|
||||
self.assertEqual(out, 'UTF-8 UTF-8')
|
||||
self.assertEqual(out, 'utf-8 utf-8')
|
||||
|
||||
@unittest.skipIf(MS_WINDOWS, 'test specific to Unix')
|
||||
def test_cmd_line(self):
|
||||
|
@ -276,7 +276,7 @@ class UTF8ModeTests(unittest.TestCase):
|
|||
# In UTF-8 Mode, device_encoding(fd) returns "UTF-8" if fd is a TTY
|
||||
with open(filename, encoding="utf8") as fp:
|
||||
out = fp.read().rstrip()
|
||||
self.assertEqual(out, 'True UTF-8')
|
||||
self.assertEqual(out, 'True utf-8')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue