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.
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 @@
   \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 @@
             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 @@
 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 @@
     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 @@
             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 @@
 		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 @@
 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 @@
 #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