Always initialize Py_FileSystemDefaultEncoding on Unix in Py_Initialize,

and not as a side effect of setlocale. Expose it as sys.getfilesystemencoding.
Adjust test case.
This commit is contained in:
Martin v. Löwis 2003-03-05 15:13:47 +00:00
parent 620c0837bd
commit 73d538b9c6
6 changed files with 67 additions and 22 deletions

View file

@ -17,6 +17,11 @@
#include <signal.h>
#endif
#ifdef HAVE_LANGINFO_H
#include <locale.h>
#include <langinfo.h>
#endif
#ifdef MS_WINDOWS
#undef BYTE
#include "windows.h"
@ -181,6 +186,29 @@ Py_Initialize(void)
initsite(); /* Module site */
PyModule_WarningsModule = PyImport_ImportModule("warnings");
#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
/* 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. */
if (!Py_FileSystemDefaultEncoding) {
char *saved_locale = setlocale(LC_CTYPE, NULL);
char *codeset;
setlocale(LC_CTYPE, "");
codeset = nl_langinfo(CODESET);
PyObject *enc = NULL;
if (*codeset) {
enc = PyCodec_Encoder(codeset);
if (enc) {
Py_FileSystemDefaultEncoding = strdup(codeset);
Py_DECREF(enc);
} else
PyErr_Clear();
}
setlocale(LC_CTYPE, saved_locale);
}
#endif
}
#ifdef COUNT_ALLOCS

View file

@ -236,6 +236,22 @@ PyDoc_STRVAR(setdefaultencoding_doc,
Set the current default string encoding used by the Unicode implementation."
);
static PyObject *
sys_getfilesystemencoding(PyObject *self)
{
if (Py_FileSystemDefaultEncoding)
return PyString_FromString(Py_FileSystemDefaultEncoding);
Py_INCREF(Py_None);
return Py_None;
}
PyDoc_STRVAR(getfilesystemencoding_doc,
"getfilesystemencoding() -> string\n\
\n\
Return the encoding used to convert Unicode filenames in\n\
operating system filenames."
);
#endif
/*
@ -649,6 +665,10 @@ static PyMethodDef sys_methods[] = {
#ifdef DYNAMIC_EXECUTION_PROFILE
{"getdxp", _Py_GetDXProfile, METH_VARARGS},
#endif
#ifdef Py_USING_UNICODE
{"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
METH_NOARGS, getfilesystemencoding_doc},
#endif
#ifdef Py_TRACE_REFS
{"getobjects", _Py_GetObjects, METH_VARARGS},
#endif