]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-74857, PEP 538: Coerce POSIX locale to UTF-8 based locale (#139238)
authorVictor Stinner <vstinner@python.org>
Tue, 23 Sep 2025 17:20:59 +0000 (19:20 +0200)
committerGitHub <noreply@github.com>
Tue, 23 Sep 2025 17:20:59 +0000 (19:20 +0200)
Lib/test/test_c_locale_coercion.py
Misc/NEWS.d/next/Core_and_Builtins/2025-09-22-15-21-49.gh-issue-74857.5XRQaA.rst [new file with mode: 0644]
Python/pylifecycle.c

index 10f8ba2255228b8e80cc81897f366898a44f6ffc..340bec3c71b68f87cc6f7c3e1d6948c88f653785 100644 (file)
@@ -15,7 +15,7 @@ from test.support.script_helper import run_python_until_end
 # 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 @@ elif sys.platform == "vxworks":
     # 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 @@ class LocaleCoercionTests(_LocaleHandlingTestCase):
             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 (file)
index 0000000..820b57e
--- /dev/null
@@ -0,0 +1,2 @@
+:pep:`538`: Coerce the POSIX locale to a UTF-8 based locale. Patch by Victor
+Stinner.
index 37af58a68d7883f5797894cc0598f1680c65c046..185c9ae752819a4c59bb88622229fc5529a13114 100644 (file)
@@ -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;