Issue #3187: Add sys.setfilesystemencoding.

This commit is contained in:
Martin v. Löwis 2008-10-03 16:09:28 +00:00
parent efb14a8857
commit 04dc25c537
6 changed files with 58 additions and 4 deletions

View file

@ -17,15 +17,34 @@
*/
#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
const char *Py_FileSystemDefaultEncoding = "mbcs";
const int Py_HasFileSystemDefaultEncoding = 1;
int Py_HasFileSystemDefaultEncoding = 1;
#elif defined(__APPLE__)
const char *Py_FileSystemDefaultEncoding = "utf-8";
const int Py_HasFileSystemDefaultEncoding = 1;
int Py_HasFileSystemDefaultEncoding = 1;
#else
const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
const int Py_HasFileSystemDefaultEncoding = 0;
int Py_HasFileSystemDefaultEncoding = 0;
#endif
int
_Py_SetFileSystemEncoding(PyObject *s)
{
PyObject *defenc;
if (!PyUnicode_Check(s)) {
PyErr_BadInternalCall();
return -1;
}
defenc = _PyUnicode_AsDefaultEncodedString(s, NULL);
if (!defenc)
return -1;
if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding)
/* A file system encoding was set at run-time */
free((char*)Py_FileSystemDefaultEncoding);
Py_FileSystemDefaultEncoding = strdup(PyBytes_AsString(defenc));
Py_HasFileSystemDefaultEncoding = 0;
return 0;
}
static PyObject *
builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
{

View file

@ -216,7 +216,24 @@ Return the encoding used to convert Unicode filenames in\n\
operating system filenames."
);
static PyObject *
sys_setfilesystemencoding(PyObject *self, PyObject *args)
{
PyObject *new_encoding;
if (!PyArg_ParseTuple(args, "U:setfilesystemencoding", &new_encoding))
return NULL;
if (_Py_SetFileSystemEncoding(new_encoding))
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
PyDoc_STRVAR(setfilesystemencoding_doc,
"setfilesystemencoding(string) -> None\n\
\n\
Set the encoding used to convert Unicode filenames in\n\
operating system filenames."
);
static PyObject *
sys_intern(PyObject *self, PyObject *args)
@ -872,6 +889,8 @@ static PyMethodDef sys_methods[] = {
#endif
{"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
setdefaultencoding_doc},
{"setfilesystemencoding", sys_setfilesystemencoding, METH_VARARGS,
setfilesystemencoding_doc},
{"setcheckinterval", sys_setcheckinterval, METH_VARARGS,
setcheckinterval_doc},
{"getcheckinterval", sys_getcheckinterval, METH_NOARGS,