diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-15 12:04:23 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-15 12:04:23 (GMT) |
commit | f3170ccef8809e4a3f82fe9f82dc7a4a486c28c1 (patch) | |
tree | b96ab0a2584f511758bad3e4ccac6c4e3ed43954 /Objects/unicodeobject.c | |
parent | 6a4aff10f0f1c34f488d5d0f932eea1fb3483dbf (diff) | |
download | cpython-f3170ccef8809e4a3f82fe9f82dc7a4a486c28c1.zip cpython-f3170ccef8809e4a3f82fe9f82dc7a4a486c28c1.tar.gz cpython-f3170ccef8809e4a3f82fe9f82dc7a4a486c28c1.tar.bz2 |
Use locale encoding if Py_FileSystemDefaultEncoding is not set
* PyUnicode_EncodeFSDefault(), PyUnicode_DecodeFSDefaultAndSize() and
PyUnicode_DecodeFSDefault() use the locale encoding instead of UTF-8 if
Py_FileSystemDefaultEncoding is NULL
* redecode_filenames() functions and _Py_code_object_list (issue #9630)
are no more needed: remove them
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index a18eeef..98427e3 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1597,11 +1597,22 @@ PyObject *PyUnicode_EncodeFSDefault(PyObject *unicode) "surrogateescape"); } else { - /* if you change the default encoding, update also - PyUnicode_DecodeFSDefaultAndSize() and redecode_filenames() */ - return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), - PyUnicode_GET_SIZE(unicode), - "surrogateescape"); + /* locale encoding with surrogateescape */ + wchar_t *wchar; + char *bytes; + PyObject *bytes_obj; + + wchar = PyUnicode_AsWideCharString(unicode, NULL); + if (wchar == NULL) + return NULL; + bytes = _Py_wchar2char(wchar); + PyMem_Free(wchar); + if (bytes == NULL) + return NULL; + + bytes_obj = PyBytes_FromString(bytes); + PyMem_Free(bytes); + return bytes_obj; } } @@ -1769,9 +1780,22 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) "surrogateescape"); } else { - /* if you change the default encoding, update also - PyUnicode_EncodeFSDefault() and redecode_filenames() */ - return PyUnicode_DecodeUTF8(s, size, "surrogateescape"); + /* locale encoding with surrogateescape */ + wchar_t *wchar; + PyObject *unicode; + + if (s[size] != '\0' || size != strlen(s)) { + PyErr_SetString(PyExc_TypeError, "embedded NUL character"); + return NULL; + } + + wchar = _Py_char2wchar(s); + if (wchar == NULL) + return NULL; + + unicode = PyUnicode_FromWideChar(wchar, -1); + PyMem_Free(wchar); + return unicode; } } |