Patch #1272, by Christian Heimes and Alexandre Vassalotti.

Changes to make __file__ a proper Unicode object, using the default
filesystem encoding.
This is a bit tricky because the default filesystem encoding isn't
set by the time we import the first modules; at that point we fudge
things a bit.  This is okay since __file__ isn't really used much
except for error reporting.
Tested on OSX and Linux only so far.
This commit is contained in:
Guido van Rossum 2007-10-15 02:52:41 +00:00
parent cdadf242ba
commit 00bc0e0a2d
17 changed files with 96 additions and 41 deletions

View file

@ -117,7 +117,11 @@ static PyUnicodeObject *unicode_latin1[256];
/* Default encoding to use and assume when NULL is passed as encoding
parameter; it is fixed to "utf-8". Always use the
PyUnicode_GetDefaultEncoding() API to access this global. */
PyUnicode_GetDefaultEncoding() API to access this global.
Don't forget to alter Py_FileSystemDefaultEncoding() if you change the
hard coded default!
*/
static const char unicode_default_encoding[] = "utf-8";
Py_UNICODE
@ -1231,6 +1235,35 @@ PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
return v;
}
PyObject*
PyUnicode_DecodeFSDefault(const char *s)
{
Py_ssize_t size = (Py_ssize_t)strlen(s);
/* During the early bootstrapping process, Py_FileSystemDefaultEncoding
can be undefined. If it is case, decode using UTF-8. The following assumes
that Py_FileSystemDefaultEncoding is set to a built-in encoding during the
bootstrapping process where the codecs aren't ready yet.
*/
if (Py_FileSystemDefaultEncoding) {
#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
if (strcmp(Py_FileSystemDefaultEncoding, "mbcs")) {
return PyUnicode_DecodeMBCS(s, size, "replace");
}
#elif defined(__APPLE__)
if (strcmp(Py_FileSystemDefaultEncoding, "utf-8")) {
return PyUnicode_DecodeUTF8(s, size, "replace");
}
#endif
return PyUnicode_Decode(s, size,
Py_FileSystemDefaultEncoding,
"replace");
}
else {
return PyUnicode_DecodeUTF8(s, size, "replace");
}
}
char*
PyUnicode_AsStringAndSize(PyObject *unicode, Py_ssize_t *psize)
{