https://github.com/python/cpython/commit/e8382e55c57e89c7f0d3f5584788d3323510c34f
commit: e8382e55c57e89c7f0d3f5584788d3323510c34f
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2025-09-23T19:20:59+02:00
summary:
gh-74857, PEP 538: Coerce POSIX locale to UTF-8 based locale (#139238)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-09-22-15-21-49.gh-issue-74857.5XRQaA.rst
M Lib/test/test_c_locale_coercion.py
M Python/pylifecycle.c
diff --git a/Lib/test/test_c_locale_coercion.py
b/Lib/test/test_c_locale_coercion.py
index 10f8ba2255228b..340bec3c71b68f 100644
--- a/Lib/test/test_c_locale_coercion.py
+++ b/Lib/test/test_c_locale_coercion.py
@@ -15,7 +15,7 @@
# Set the list of ways we expect to be able to ask for the "C" locale.
# 'invalid.ascii' is an invalid LOCALE name and so should get turned in to the
# default locale, which is traditionally C.
-EXPECTED_C_LOCALE_EQUIVALENTS = ["C", "invalid.ascii"]
+EXPECTED_C_LOCALE_EQUIVALENTS = ["C", "POSIX", "invalid.ascii"]
# Set our expectation for the default encoding used in the C locale
# for the filesystem encoding and the standard streams
@@ -55,11 +55,6 @@
# VxWorks defaults to using UTF-8 for all system interfaces
EXPECTED_C_LOCALE_STREAM_ENCODING = "utf-8"
EXPECTED_C_LOCALE_FS_ENCODING = "utf-8"
-if sys.platform.startswith("linux"):
- # Linux recognizes POSIX as a synonym for C. Python will always coerce
- # if the locale is set to POSIX, but not all platforms will use the
- # C locale encodings if POSIX is set, so we'll only test it on linux.
- EXPECTED_C_LOCALE_EQUIVALENTS.append("POSIX")
# Note that the above expectations are still wrong in some cases, such as:
# * Windows when PYTHONLEGACYWINDOWSFSENCODING is set
@@ -467,8 +462,9 @@ def test_PYTHONCOERCECLOCALE_set_to_one(self):
loc = locale.setlocale(locale.LC_CTYPE, "")
except locale.Error as e:
self.skipTest(str(e))
- if loc == "C":
- self.skipTest("test requires LC_CTYPE locale different than C")
+ if loc in ("C", "POSIX"):
+ self.skipTest("test requires LC_CTYPE locale different "
+ "than C and POSIX")
if loc in TARGET_LOCALES :
self.skipTest("coerced LC_CTYPE locale: %s" % loc)
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-22-15-21-49.gh-issue-74857.5XRQaA.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-22-15-21-49.gh-issue-74857.5XRQaA.rst
new file mode 100644
index 00000000000000..820b57e920020b
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-22-15-21-49.gh-issue-74857.5XRQaA.rst
@@ -0,0 +1,2 @@
+:pep:`538`: Coerce the POSIX locale to a UTF-8 based locale. Patch by Victor
+Stinner.
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 37af58a68d7883..185c9ae752819a 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -209,7 +209,10 @@ _Py_LegacyLocaleDetected(int warn)
* we may also want to check for that explicitly.
*/
const char *ctype_loc = setlocale(LC_CTYPE, NULL);
- return ctype_loc != NULL && strcmp(ctype_loc, "C") == 0;
+ if (ctype_loc == NULL) {
+ return 0;
+ }
+ return (strcmp(ctype_loc, "C") == 0 || strcmp(ctype_loc, "POSIX") == 0);
#else
/* Windows uses code pages instead of locales, so no locale is legacy */
return 0;
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]