Enable shortcuts for common encodings in PyUnicode_AsEncodedString() for any

error handler, not only the default error handler (strict)
This commit is contained in:
Victor Stinner 2010-05-15 13:14:32 +00:00
parent b744ba1d14
commit 59e62db0a3
2 changed files with 33 additions and 22 deletions

View file

@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Enable shortcuts for common encodings in PyUnicode_AsEncodedString() for any
error handler, not only the default error handler (strict)
- Issue #8610: Load file system codec at startup, and display a fatal error on - Issue #8610: Load file system codec at startup, and display a fatal error on
failure. Set the file system encoding to utf-8 (instead of None) if getting failure. Set the file system encoding to utf-8 (instead of None) if getting
the locale encoding failed, or if nl_langinfo(CODESET) function is missing. the locale encoding failed, or if nl_langinfo(CODESET) function is missing.

View file

@ -1476,31 +1476,39 @@ PyObject *PyUnicode_AsEncodedString(PyObject *unicode,
encoding = PyUnicode_GetDefaultEncoding(); encoding = PyUnicode_GetDefaultEncoding();
/* Shortcuts for common default encodings */ /* Shortcuts for common default encodings */
if (errors == NULL) { if (strcmp(encoding, "utf-8") == 0)
if (strcmp(encoding, "utf-8") == 0) return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode),
return PyUnicode_AsUTF8String(unicode); PyUnicode_GET_SIZE(unicode),
else if (strcmp(encoding, "latin-1") == 0) errors);
return PyUnicode_AsLatin1String(unicode); else if (strcmp(encoding, "latin-1") == 0)
return PyUnicode_EncodeLatin1(PyUnicode_AS_UNICODE(unicode),
PyUnicode_GET_SIZE(unicode),
errors);
#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T) #if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
else if (strcmp(encoding, "mbcs") == 0) else if (strcmp(encoding, "mbcs") == 0)
return PyUnicode_AsMBCSString(unicode); return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(unicode),
PyUnicode_GET_SIZE(unicode),
errors);
#endif #endif
else if (strcmp(encoding, "ascii") == 0) else if (strcmp(encoding, "ascii") == 0)
return PyUnicode_AsASCIIString(unicode); return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode),
/* During bootstrap, we may need to find the encodings PyUnicode_GET_SIZE(unicode),
package, to load the file system encoding, and require the errors);
file system encoding in order to load the encodings /* During bootstrap, we may need to find the encodings
package. package, to load the file system encoding, and require the
file system encoding in order to load the encodings
package.
Break out of this dependency by assuming that the path to Break out of this dependency by assuming that the path to
the encodings module is ASCII-only. XXX could try wcstombs the encodings module is ASCII-only. XXX could try wcstombs
instead, if the file system encoding is the locale's instead, if the file system encoding is the locale's
encoding. */ encoding. */
else if (Py_FileSystemDefaultEncoding && else if (Py_FileSystemDefaultEncoding &&
strcmp(encoding, Py_FileSystemDefaultEncoding) == 0 && strcmp(encoding, Py_FileSystemDefaultEncoding) == 0 &&
!PyThreadState_GET()->interp->codecs_initialized) !PyThreadState_GET()->interp->codecs_initialized)
return PyUnicode_AsASCIIString(unicode); return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode),
} PyUnicode_GET_SIZE(unicode),
errors);
/* Encode via the codec registry */ /* Encode via the codec registry */
v = PyCodec_Encode(unicode, encoding, errors); v = PyCodec_Encode(unicode, encoding, errors);