From 5833a2f6fdc6ee58b23a02380093bf1bfb015f3c Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 30 Oct 2008 21:40:04 +0000 Subject: Issue #4213: The file system encoding is now normalized by the codec subsystem, for example UTF-8 is turned into utf-8. Patch created by Victor and reviewed by me. The change is required for proper initialization of subinterpreters. --- Python/pythonrun.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) (limited to 'Python/pythonrun.c') diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 3e40d51fc0..4fb2b3e40d 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -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; -- cgit v1.2.1