[Python-checkins] cpython: Issue #9642: Fix filesystem encoding initialization: use the ANSI code page on

victor.stinner python-checkins at python.org
Mon Jul 4 13:49:04 CEST 2011


http://hg.python.org/cpython/rev/7ce685cda0ae
changeset:   71191:7ce685cda0ae
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Mon Jul 04 13:48:30 2011 +0200
summary:
  Issue #9642: Fix filesystem encoding initialization: use the ANSI code page on
Windows if the mbcs codec is not available, and fail with a fatal error if we
cannot get the locale encoding (if nl_langinfo(CODESET) is not available)
instead of using UTF-8.

files:
  Misc/NEWS            |   5 +++++
  Python/bltinmodule.c |   5 +----
  Python/pythonrun.c   |  28 ++++++++++++++--------------
  3 files changed, 20 insertions(+), 18 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,11 @@
 Core and Builtins
 -----------------
 
+- Issue #9642: Fix filesystem encoding initialization: use the ANSI code page
+  on Windows if the mbcs codec is not available, and fail with a fatal error if
+  we cannot get the locale encoding (if nl_langinfo(CODESET) is not available)
+  instead of using UTF-8.
+
 - When a generator yields, do not retain the caller's exception state on the
   generator.
 
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -24,12 +24,9 @@
 #elif defined(__APPLE__)
 const char *Py_FileSystemDefaultEncoding = "utf-8";
 int Py_HasFileSystemDefaultEncoding = 1;
-#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
+#else
 const char *Py_FileSystemDefaultEncoding = NULL; /* set by initfsencoding() */
 int Py_HasFileSystemDefaultEncoding = 0;
-#else
-const char *Py_FileSystemDefaultEncoding = "utf-8";
-int Py_HasFileSystemDefaultEncoding = 1;
 #endif
 
 static PyObject *
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -168,18 +168,25 @@
     return NULL;
 }
 
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
 static char*
-get_codeset(void)
+get_locale_encoding(void)
 {
+#ifdef MS_WINDOWS
+    char codepage[100];
+    PyOS_snprintf(codepage, sizeof(codepage), "cp%d", GetACP());
+    return get_codec_name(codepage);
+#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
     char* codeset = nl_langinfo(CODESET);
     if (!codeset || codeset[0] == '\0') {
         PyErr_SetString(PyExc_ValueError, "CODESET is not set or empty");
         return NULL;
     }
     return get_codec_name(codeset);
+#else
+    PyErr_SetNone(PyExc_NotImplementedError);
+    return NULL;
+#endif
 }
-#endif
 
 void
 Py_InitializeEx(int install_sigs)
@@ -746,24 +753,17 @@
 initfsencoding(PyInterpreterState *interp)
 {
     PyObject *codec;
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
-    char *codeset = NULL;
 
-    if (Py_FileSystemDefaultEncoding == NULL) {
-        /* On Unix, set the file system encoding according to the
-           user's preference, if the CODESET names a well-known
-           Python codec, and Py_FileSystemDefaultEncoding isn't
-           initialized by other means. */
-        codeset = get_codeset();
-        if (codeset == NULL)
+    if (Py_FileSystemDefaultEncoding == NULL)
+    {
+        Py_FileSystemDefaultEncoding = get_locale_encoding();
+        if (Py_FileSystemDefaultEncoding == NULL)
             Py_FatalError("Py_Initialize: Unable to get the locale encoding");
 
-        Py_FileSystemDefaultEncoding = codeset;
         Py_HasFileSystemDefaultEncoding = 0;
         interp->fscodec_initialized = 1;
         return 0;
     }
-#endif
 
     /* the encoding is mbcs, utf-8 or ascii */
     codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list