From 5833a2f6fdc6ee58b23a02380093bf1bfb015f3c Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 30 Oct 2008 21:40:04 +0000 Subject: [PATCH] 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. --- Misc/NEWS | 3 +++ Python/pythonrun.c | 41 ++++++++++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 20359ff886..72a482eff6 100644 --- 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. 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; -- 2.40.0