Index: Python/import.c =================================================================== --- Python/import.c (révision 81169) +++ Python/import.c (copie de travail) @@ -1633,8 +1633,7 @@ if (!v) return NULL; if (PyUnicode_Check(v)) { - v = PyUnicode_AsEncodedString(v, - Py_FileSystemDefaultEncoding, NULL); + v = PyUnicode_EncodeFSDefault(v); if (v == NULL) return NULL; } @@ -2752,14 +2751,7 @@ char *subname; PyObject *submod; char *p; - if (!Py_FileSystemDefaultEncoding) { - item8 = PyUnicode_EncodeASCII(PyUnicode_AsUnicode(item), - PyUnicode_GetSize(item), - NULL); - } else { - item8 = PyUnicode_AsEncodedString(item, - Py_FileSystemDefaultEncoding, NULL); - } + item8 = PyUnicode_EncodeFSDefault(item); if (!item8) { PyErr_SetString(PyExc_ValueError, "Cannot encode path item"); return 0; Index: Include/unicodeobject.h =================================================================== --- Include/unicodeobject.h (révision 81169) +++ Include/unicodeobject.h (copie de travail) @@ -1268,6 +1268,16 @@ Py_ssize_t size /* size */ ); +/* Encode a Unicode object to Py_FileSystemDefaultEncoding with the + "surrogateescape" error handler, return a bytes object. + + If Py_FileSystemDefaultEncoding is not set, fall back to UTF-8. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeFSDefault( + PyObject *unicode + ); + /* --- Methods & Slots ---------------------------------------------------- These are capable of handling Unicode objects and strings on input Index: Objects/unicodeobject.c =================================================================== --- Objects/unicodeobject.c (révision 81169) +++ Objects/unicodeobject.c (copie de travail) @@ -1461,6 +1461,18 @@ return NULL; } +PyObject *PyUnicode_EncodeFSDefault(PyObject *unicode) +{ + if (Py_FileSystemDefaultEncoding) + return PyUnicode_AsEncodedString(unicode, + Py_FileSystemDefaultEncoding, + "surrogateescape"); + else + return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), + PyUnicode_GET_SIZE(unicode), + "surrogateescape"); +} + PyObject *PyUnicode_AsEncodedString(PyObject *unicode, const char *encoding, const char *errors) @@ -1638,9 +1650,7 @@ arg = PyUnicode_FromObject(arg); if (!arg) return 0; - output = PyUnicode_AsEncodedObject(arg, - Py_FileSystemDefaultEncoding, - "surrogateescape"); + output = PyUnicode_EncodeFSDefault(arg); Py_DECREF(arg); if (!output) return 0; Index: Doc/c-api/unicode.rst =================================================================== --- Doc/c-api/unicode.rst (révision 81169) +++ Doc/c-api/unicode.rst (copie de travail) @@ -396,6 +396,7 @@ Use :func:`PyUnicode_DecodeFSDefaultAndSize` if you know the string length. + .. cfunction:: PyObject* PyUnicode_DecodeFSDefault(const char *s) Decode a string using :cdata:`Py_FileSystemDefaultEncoding` and @@ -404,6 +405,16 @@ If :cdata:`Py_FileSystemDefaultEncoding` is not set, fall back to UTF-8. +.. cfunction:: PyObject* PyUnicode_EncodeFSDefault(PyObject *unicode) + + Encodes a Unicode object to :cdata:`Py_FileSystemDefaultEncoding` with the + ``'surrogateescape'`` error handler and returns a bytes object. + + If :cdata:`Py_FileSystemDefaultEncoding` is not set, fallback to UTF-8. + + .. versionadded:: 3.2 + + wchar_t Support """"""""""""""" Index: Modules/grpmodule.c =================================================================== --- Modules/grpmodule.c (révision 81169) +++ Modules/grpmodule.c (copie de travail) @@ -111,8 +111,7 @@ if (!PyArg_ParseTuple(args, "U:getgrnam", &arg)) return NULL; - if ((bytes = PyUnicode_AsEncodedString(arg, Py_FileSystemDefaultEncoding, - "surrogateescape")) == NULL) + if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) return NULL; if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) goto out; Index: Modules/_tkinter.c =================================================================== --- Modules/_tkinter.c (révision 81169) +++ Modules/_tkinter.c (copie de travail) @@ -3147,9 +3147,7 @@ it also helps Tcl find its encodings. */ uexe = PyUnicode_FromWideChar(Py_GetProgramName(), -1); if (uexe) { - cexe = PyUnicode_AsEncodedString(uexe, - Py_FileSystemDefaultEncoding, - NULL); + cexe = PyUnicode_EncodeFSDefault(uexe); if (cexe) Tcl_FindExecutable(PyBytes_AsString(cexe)); Py_XDECREF(cexe); Index: Modules/_io/fileio.c =================================================================== --- Modules/_io/fileio.c (révision 81169) +++ Modules/_io/fileio.c (copie de travail) @@ -247,8 +247,7 @@ if (u == NULL) return -1; - stringobj = PyUnicode_AsEncodedString( - u, Py_FileSystemDefaultEncoding, "surrogateescape"); + stringobj = PyUnicode_EncodeFSDefault(u); Py_DECREF(u); if (stringobj == NULL) return -1; Index: Modules/pwdmodule.c =================================================================== --- Modules/pwdmodule.c (révision 81169) +++ Modules/pwdmodule.c (copie de travail) @@ -132,9 +132,7 @@ if (!PyArg_ParseTuple(args, "U:getpwnam", &arg)) return NULL; - if ((bytes = PyUnicode_AsEncodedString(arg, - Py_FileSystemDefaultEncoding, - "surrogateescape")) == NULL) + if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) return NULL; if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) goto out; Index: Modules/spwdmodule.c =================================================================== --- Modules/spwdmodule.c (révision 81169) +++ Modules/spwdmodule.c (copie de travail) @@ -118,9 +118,7 @@ if (!PyArg_ParseTuple(args, "U:getspnam", &arg)) return NULL; - if ((bytes = PyUnicode_AsEncodedString(arg, - Py_FileSystemDefaultEncoding, - "surrogateescape")) == NULL) + if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) return NULL; if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) goto out;