]> granicus.if.org Git - python/commitdiff
Always initialize Py_FileSystemDefaultEncoding on Unix in Py_Initialize,
authorMartin v. Löwis <martin@v.loewis.de>
Wed, 5 Mar 2003 15:13:47 +0000 (15:13 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Wed, 5 Mar 2003 15:13:47 +0000 (15:13 +0000)
and not as a side effect of setlocale. Expose it as sys.getfilesystemencoding.
Adjust test case.

Doc/lib/libsys.tex
Lib/test/test_support.py
Misc/NEWS
Modules/_localemodule.c
Python/pythonrun.c
Python/sysmodule.c

index d027aa62ac7081321784cabc0a079e8990aec327..b8b781bab0766949088315004a555170ac821dbc 100644 (file)
@@ -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
index 8ac385134a4bf54f5af9b8fac9d3bf6f47c0f5e5..776341dfcc93280b92bbae05613422efb0ea3c4b 100644 (file)
@@ -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'
 
index fa1b8f9fc3c495350b11c2127e9593be85b38f2c..59d08bba0ea5f33f3bbf1a0d2721b5f28a73b3eb 100644 (file)
--- 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
index 2077be827acf4a7e2ced1de73fcb45c3d884c0a3..840f8385f20668dae899d8326ce59db8be2eb77d 100644 (file)
@@ -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 */
index 908bc42f6efc702ec1269aee02c82def9aada927..62dfd9306d0a15f79226af88846cbf53e4a02829 100644 (file)
 #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
index 13b86f2270bc6017f1fc4ce031378a116c029c77..fa7f3c4a544a0eaa96a91932b64539081f60df9b 100644 (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