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]

Reply via email to