changeset: 74007:51412b4b81ae user: Victor Stinner date: Sat Dec 17 04:45:09 2011 +0100 files: Misc/NEWS Modules/posixmodule.c Modules/socketmodule.c Objects/unicodeobject.c Python/errors.c description: Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8 diff -r 88198b93ff2f -r 51412b4b81ae Misc/NEWS --- a/Misc/NEWS Sat Dec 17 04:13:41 2011 +0100 +++ b/Misc/NEWS Sat Dec 17 04:45:09 2011 +0100 @@ -419,6 +419,9 @@ Library ------- +- Issue #13560: os.strerror() now uses the current locale encoding instead of + UTF-8. + - Issue #13560: Add PyUnicode_DecodeLocale(), PyUnicode_DecodeLocaleAndSize() and PyUnicode_EncodeLocale() functions to the C API to decode/encode from/to the current locale encoding. diff -r 88198b93ff2f -r 51412b4b81ae Modules/posixmodule.c --- a/Modules/posixmodule.c Sat Dec 17 04:13:41 2011 +0100 +++ b/Modules/posixmodule.c Sat Dec 17 04:45:09 2011 +0100 @@ -7891,7 +7891,7 @@ "strerror() argument out of range"); return NULL; } - return PyUnicode_FromString(message); + return PyUnicode_DecodeLocale(message, 1); } diff -r 88198b93ff2f -r 51412b4b81ae Modules/socketmodule.c --- a/Modules/socketmodule.c Sat Dec 17 04:13:41 2011 +0100 +++ b/Modules/socketmodule.c Sat Dec 17 04:45:09 2011 +0100 @@ -4032,9 +4032,8 @@ if (h->h_addrtype != af) { /* Let's get real error message to return */ - PyErr_SetString(PyExc_OSError, - (char *)strerror(EAFNOSUPPORT)); - + errno = EAFNOSUPPORT; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } diff -r 88198b93ff2f -r 51412b4b81ae Objects/unicodeobject.c --- a/Objects/unicodeobject.c Sat Dec 17 04:13:41 2011 +0100 +++ b/Objects/unicodeobject.c Sat Dec 17 04:45:09 2011 +0100 @@ -3132,6 +3132,7 @@ wchar_t *wstr; PyObject *bytes = NULL; char *errmsg; + PyObject *reason; PyObject *exc; size_t error_pos; @@ -3193,17 +3194,28 @@ encode_error: errmsg = strerror(errno); assert(errmsg != NULL); - if (errmsg == NULL) - errmsg = "wcstombs() encountered an unencodable wide character"; PyMem_Free(wstr); Py_XDECREF(bytes); - exc = NULL; - raise_encode_exception(&exc, - "locale", unicode, - error_pos, error_pos+1, - errmsg); - Py_XDECREF(exc); + if (errmsg != NULL) + reason = PyUnicode_DecodeLocale(errmsg, 1); + else + reason = PyUnicode_FromString( + "wcstombs() encountered an unencodable " + "wide character"); + if (reason == NULL) + return NULL; + + exc = PyObject_CallFunction(PyExc_UnicodeEncodeError, "sOnnO", + "locale", unicode, + (Py_ssize_t)error_pos, + (Py_ssize_t)(error_pos+1), + reason); + Py_DECREF(reason); + if (exc != NULL) { + PyCodec_StrictErrors(exc); + Py_XDECREF(exc); + } return NULL; } diff -r 88198b93ff2f -r 51412b4b81ae Python/errors.c --- a/Python/errors.c Sat Dec 17 04:13:41 2011 +0100 +++ b/Python/errors.c Sat Dec 17 04:45:09 2011 +0100 @@ -343,9 +343,7 @@ PyObject *message; PyObject *v, *args; int i = errno; -#ifndef MS_WINDOWS - char *s; -#else +#ifdef MS_WINDOWS WCHAR *s_buf = NULL; #endif /* Unix/Windows */ @@ -355,11 +353,14 @@ #endif #ifndef MS_WINDOWS - if (i == 0) - s = "Error"; /* Sometimes errno didn't get set */ - else - s = strerror(i); - message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore"); + if (i != 0) { + char *s = strerror(i); + message = PyUnicode_DecodeLocale(s, 1); + } + else { + /* Sometimes errno didn't get set */ + message = PyUnicode_FromString("Error"); + } #else if (i == 0) message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */

AltStyle によって変換されたページ (->オリジナル) /