Issue #9642: Fix filesystem encoding initialization: use the ANSI code page on
Windows if the mbcs codec is not available, and fail with a fatal error if we cannot get the locale encoding (if nl_langinfo(CODESET) is not available) instead of using UTF-8.
This commit is contained in:
parent
c5ee7f213e
commit
d64e8a75e5
|
@ -10,6 +10,11 @@ What's New in Python 3.3 Alpha 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #9642: Fix filesystem encoding initialization: use the ANSI code page
|
||||
on Windows if the mbcs codec is not available, and fail with a fatal error if
|
||||
we cannot get the locale encoding (if nl_langinfo(CODESET) is not available)
|
||||
instead of using UTF-8.
|
||||
|
||||
- When a generator yields, do not retain the caller's exception state on the
|
||||
generator.
|
||||
|
||||
|
|
|
@ -24,12 +24,9 @@ int Py_HasFileSystemDefaultEncoding = 1;
|
|||
#elif defined(__APPLE__)
|
||||
const char *Py_FileSystemDefaultEncoding = "utf-8";
|
||||
int Py_HasFileSystemDefaultEncoding = 1;
|
||||
#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||
#else
|
||||
const char *Py_FileSystemDefaultEncoding = NULL; /* set by initfsencoding() */
|
||||
int Py_HasFileSystemDefaultEncoding = 0;
|
||||
#else
|
||||
const char *Py_FileSystemDefaultEncoding = "utf-8";
|
||||
int Py_HasFileSystemDefaultEncoding = 1;
|
||||
#endif
|
||||
|
||||
static PyObject *
|
||||
|
|
|
@ -168,18 +168,25 @@ error:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
#if defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||
static char*
|
||||
get_codeset(void)
|
||||
get_locale_encoding(void)
|
||||
{
|
||||
#ifdef MS_WINDOWS
|
||||
char codepage[100];
|
||||
PyOS_snprintf(codepage, sizeof(codepage), "cp%d", GetACP());
|
||||
return get_codec_name(codepage);
|
||||
#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||
char* codeset = nl_langinfo(CODESET);
|
||||
if (!codeset || codeset[0] == '\0') {
|
||||
PyErr_SetString(PyExc_ValueError, "CODESET is not set or empty");
|
||||
return NULL;
|
||||
}
|
||||
return get_codec_name(codeset);
|
||||
}
|
||||
#else
|
||||
PyErr_SetNone(PyExc_NotImplementedError);
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
Py_InitializeEx(int install_sigs)
|
||||
|
@ -746,24 +753,17 @@ static int
|
|||
initfsencoding(PyInterpreterState *interp)
|
||||
{
|
||||
PyObject *codec;
|
||||
#if defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||
char *codeset = NULL;
|
||||
|
||||
if (Py_FileSystemDefaultEncoding == NULL) {
|
||||
/* 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. */
|
||||
codeset = get_codeset();
|
||||
if (codeset == NULL)
|
||||
if (Py_FileSystemDefaultEncoding == NULL)
|
||||
{
|
||||
Py_FileSystemDefaultEncoding = get_locale_encoding();
|
||||
if (Py_FileSystemDefaultEncoding == NULL)
|
||||
Py_FatalError("Py_Initialize: Unable to get the locale encoding");
|
||||
|
||||
Py_FileSystemDefaultEncoding = codeset;
|
||||
Py_HasFileSystemDefaultEncoding = 0;
|
||||
interp->fscodec_initialized = 1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* the encoding is mbcs, utf-8 or ascii */
|
||||
codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);
|
||||
|
|
Loading…
Reference in New Issue