summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/lib/libsys.tex16
-rw-r--r--Lib/test/test_support.py3
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_localemodule.c20
-rw-r--r--Python/pythonrun.c28
-rw-r--r--Python/sysmodule.c20
6 files changed, 67 insertions, 22 deletions
diff --git a/Doc/lib/libsys.tex b/Doc/lib/libsys.tex
index d027aa6..b8b781b 100644
--- a/Doc/lib/libsys.tex
+++ b/Doc/lib/libsys.tex
@@ -211,6 +211,22 @@ It is always available.
\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
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
index 8ac3851..776341d 100644
--- a/Lib/test/test_support.py
+++ b/Lib/test/test_support.py
@@ -109,8 +109,7 @@ elif os.name != 'riscos':
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'
diff --git a/Misc/NEWS b/Misc/NEWS
index fa1b8f9..59d08bb 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.3 beta 1?
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
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index 2077be8..840f838 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -161,10 +161,6 @@ fixup_ulcase(void)
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)
{
@@ -213,22 +209,6 @@ 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 */
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 908bc42..62dfd93 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -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
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 13b86f2..fa7f3c4 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -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