]> granicus.if.org Git - python/commitdiff
Issue #4213: The file system encoding is now normalized by the codec subsystem, for...
authorChristian Heimes <christian@cheimes.de>
Thu, 30 Oct 2008 21:40:04 +0000 (21:40 +0000)
committerChristian Heimes <christian@cheimes.de>
Thu, 30 Oct 2008 21:40:04 +0000 (21:40 +0000)
Patch created by Victor and reviewed by me. The change is required for proper initialization of subinterpreters.

Misc/NEWS
Python/pythonrun.c

index 20359ff886c93042b182c16f8371c35db15f572d..72a482eff64f3c899963f7b57de342c60f6c1b25 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,9 @@ What's New in Python 3.0 beta 5
 Core and Builtins
 -----------------
 
+- Issue #4213: The file system encoding is now normalized by the
+  codec subsystem, for example UTF-8 is turned into utf-8.
+
 - Issue #4200: Changed the atexit module to store its state in its
   PyModuleDef atexitmodule. This fixes a bug with multiple subinterpeters.
 
index 3e40d51fc0db0297ee670f989d1257fcbdcf06ab..4fb2b3e40d29067fa753f9ae8d48b8d54bf41ab8 100644 (file)
@@ -126,6 +126,37 @@ add_flag(int flag, const char *envs)
        return flag;
 }
 
+#if defined(HAVE_LANGINFO_H) && defined(CODESET)
+static char*
+get_codeset(void)
+{
+       char* codeset;
+       PyObject *codec, *name;
+
+       codeset = nl_langinfo(CODESET);
+       if (!codeset || codeset[0] == '\0')
+               return NULL;
+
+       codec = _PyCodec_Lookup(codeset);
+       if (!codec)
+               goto error;
+
+       name = PyObject_GetAttrString(codec, "name");
+       Py_CLEAR(codec);
+       if (!name)
+               goto error;
+
+       codeset = strdup(_PyUnicode_AsString(name));
+       Py_DECREF(name);
+       return codeset;
+
+error:
+       Py_XDECREF(codec);
+       PyErr_Clear();
+       return NULL;
+}
+#endif
+
 void
 Py_InitializeEx(int install_sigs)
 {
@@ -257,15 +288,7 @@ Py_InitializeEx(int install_sigs)
           initialized by other means. Also set the encoding of
           stdin and stdout if these are terminals.  */
 
-       codeset = nl_langinfo(CODESET);
-       if (codeset && *codeset) {
-           if (PyCodec_KnownEncoding(codeset))
-               codeset = strdup(codeset);
-           else
-               codeset = NULL;
-       } else
-               codeset = NULL;
-
+       codeset = get_codeset();
        if (codeset) {
                if (!Py_FileSystemDefaultEncoding)
                        Py_FileSystemDefaultEncoding = codeset;