and not as a side effect of setlocale. Expose it as sys.getfilesystemencoding.
Adjust test case.
\versionadded{2.2}
\end{funcdesc}
+\begin{funcdesc}{getfilesystemencoding}{}
+ Return the name of the encoding used to convert Unicode filenames
+ into system file names, or \code{None} if the system default encoding
+ is used. The result value depends on the operating system:
+\begin{itemize}
+\item On Windows 9x, the encoding is ``mbcs''.
+\item On Mac OS X, the encoding is ``utf-8''.
+\item On Unix, the encoding is the user's preference
+ according to the result of nl_langinfo(CODESET), or None if
+ the nl_langinfo(CODESET) failed.
+\item On Windows NT+, file names are Unicode natively, so no conversion
+ is performed.
+\end{itemize}
+ \versionadded{2.3}
+\end{funcdesc}
+
\begin{funcdesc}{getrefcount}{object}
Return the reference count of the \var{object}. The count returned
is generally one higher than you might expect, because it includes
TESTFN_UNICODE="@test-\xe0\xf2"
else:
TESTFN_UNICODE=unicode("@test-\xe0\xf2", "latin-1") # 2 latin characters.
- if os.name=="nt":
- TESTFN_ENCODING="mbcs"
+ TESTFN_ENCODING=sys.getfilesystemencoding()
else:
TESTFN = 'test'
Core and builtins
-----------------
+- sys.getfilesystemencoding() was added to expose
+ Py_FileSystemDefaultEncoding.
- New function sys.exc_clear() clears the current exception. This is
rarely needed, but can sometimes be useful to release objects
Py_DECREF(ulo);
}
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
-static int fileencoding_uses_locale = 0;
-#endif
-
static PyObject*
PyLocale_setlocale(PyObject* self, PyObject* args)
{
fixup_ulcase();
/* things that got wrong up to here are ignored */
PyErr_Clear();
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
- if (Py_FileSystemDefaultEncoding == NULL)
- fileencoding_uses_locale = 1;
- if (fileencoding_uses_locale) {
- char *codeset = nl_langinfo(CODESET);
- PyObject *enc = NULL;
- if (*codeset && (enc = PyCodec_Encoder(codeset))) {
- /* Release previous file encoding */
- if (Py_FileSystemDefaultEncoding)
- free((char *)Py_FileSystemDefaultEncoding);
- Py_FileSystemDefaultEncoding = strdup(codeset);
- Py_DECREF(enc);
- } else
- PyErr_Clear();
- }
-#endif
} else {
/* get locale */
/* restore LC_NUMERIC first, if appropriate */
#include <signal.h>
#endif
+#ifdef HAVE_LANGINFO_H
+#include <locale.h>
+#include <langinfo.h>
+#endif
+
#ifdef MS_WINDOWS
#undef BYTE
#include "windows.h"
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
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
/*
#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