Commit 5833a2f6 authored by Christian Heimes's avatar Christian Heimes

Issue #4213: The file system encoding is now normalized by the codec...

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.
parent 9c94ba4e
...@@ -15,6 +15,9 @@ What's New in Python 3.0 beta 5 ...@@ -15,6 +15,9 @@ What's New in Python 3.0 beta 5
Core and Builtins 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 - Issue #4200: Changed the atexit module to store its state in its
PyModuleDef atexitmodule. This fixes a bug with multiple subinterpeters. PyModuleDef atexitmodule. This fixes a bug with multiple subinterpeters.
......
...@@ -126,6 +126,37 @@ add_flag(int flag, const char *envs) ...@@ -126,6 +126,37 @@ add_flag(int flag, const char *envs)
return flag; 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 void
Py_InitializeEx(int install_sigs) Py_InitializeEx(int install_sigs)
{ {
...@@ -257,15 +288,7 @@ Py_InitializeEx(int install_sigs) ...@@ -257,15 +288,7 @@ Py_InitializeEx(int install_sigs)
initialized by other means. Also set the encoding of initialized by other means. Also set the encoding of
stdin and stdout if these are terminals. */ stdin and stdout if these are terminals. */
codeset = nl_langinfo(CODESET); codeset = get_codeset();
if (codeset && *codeset) {
if (PyCodec_KnownEncoding(codeset))
codeset = strdup(codeset);
else
codeset = NULL;
} else
codeset = NULL;
if (codeset) { if (codeset) {
if (!Py_FileSystemDefaultEncoding) if (!Py_FileSystemDefaultEncoding)
Py_FileSystemDefaultEncoding = codeset; Py_FileSystemDefaultEncoding = codeset;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment