]> granicus.if.org Git - python/commitdiff
Enable shortcuts for common encodings in PyUnicode_AsEncodedString() for any
authorVictor Stinner <victor.stinner@haypocalc.com>
Sat, 15 May 2010 13:14:32 +0000 (13:14 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Sat, 15 May 2010 13:14:32 +0000 (13:14 +0000)
error handler, not only the default error handler (strict)

Misc/NEWS
Objects/unicodeobject.c

index 8b72124e623042d6b761afd6f5afd0fa01be77b8..31a063de9188de4e6e7e590278a92c61b513f1c9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1?
 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
   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.
index 23b322f3043bcdc6f87a967d427799fa915eb5ed..307027a8119b4f85f6de62d9705d147fe414acd1 100644 (file)
@@ -1476,31 +1476,39 @@ PyObject *PyUnicode_AsEncodedString(PyObject *unicode,
         encoding = PyUnicode_GetDefaultEncoding();
 
     /* Shortcuts for common default encodings */
-    if (errors == NULL) {
-        if (strcmp(encoding, "utf-8") == 0)
-            return PyUnicode_AsUTF8String(unicode);
-        else if (strcmp(encoding, "latin-1") == 0)
-            return PyUnicode_AsLatin1String(unicode);
+    if (strcmp(encoding, "utf-8") == 0)
+        return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode),
+                                    PyUnicode_GET_SIZE(unicode),
+                                    errors);
+    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)
-        else if (strcmp(encoding, "mbcs") == 0)
-            return PyUnicode_AsMBCSString(unicode);
+    else if (strcmp(encoding, "mbcs") == 0)
+        return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(unicode),
+                                    PyUnicode_GET_SIZE(unicode),
+                                    errors);
 #endif
-        else if (strcmp(encoding, "ascii") == 0)
-            return PyUnicode_AsASCIIString(unicode);
-        /* During bootstrap, we may need to find the encodings
-           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
-           the encodings module is ASCII-only.  XXX could try wcstombs
-           instead, if the file system encoding is the locale's
-           encoding. */
-        else if (Py_FileSystemDefaultEncoding &&
-                 strcmp(encoding, Py_FileSystemDefaultEncoding) == 0 &&
-                 !PyThreadState_GET()->interp->codecs_initialized)
-            return PyUnicode_AsASCIIString(unicode);
-    }
+    else if (strcmp(encoding, "ascii") == 0)
+        return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode),
+                                     PyUnicode_GET_SIZE(unicode),
+                                     errors);
+    /* During bootstrap, we may need to find the encodings
+       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
+       the encodings module is ASCII-only.  XXX could try wcstombs
+       instead, if the file system encoding is the locale's
+       encoding. */
+    else if (Py_FileSystemDefaultEncoding &&
+             strcmp(encoding, Py_FileSystemDefaultEncoding) == 0 &&
+             !PyThreadState_GET()->interp->codecs_initialized)
+        return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode),
+                                     PyUnicode_GET_SIZE(unicode),
+                                     errors);
 
     /* Encode via the codec registry */
     v = PyCodec_Encode(unicode, encoding, errors);