self.assertEqual(unicode(o), u'unicode(obj) is compatible to str()')
self.assertEqual(str(o), 'unicode(obj) is compatible to str()')
+ # %-formatting and .__unicode__()
+ self.assertEqual(u'%s' %
+ UnicodeCompat(u"u'%s' % obj uses obj.__unicode__()"),
+ u"u'%s' % obj uses obj.__unicode__()")
+ self.assertEqual(u'%s' %
+ UnicodeCompat(u"u'%s' % obj falls back to obj.__str__()"),
+ u"u'%s' % obj falls back to obj.__str__()")
+
for obj in (123, 123.45, 123L):
self.assertEqual(unicode(obj), unicode(str(obj)))
else {
PyObject *unicode;
if (c == 's')
- temp = PyObject_Str(v);
+ temp = PyObject_Unicode(v);
else
temp = PyObject_Repr(v);
if (temp == NULL)
goto onError;
- if (!PyString_Check(temp)) {
- /* XXX Note: this should never happen, since
- PyObject_Repr() and PyObject_Str() assure
- this */
- Py_DECREF(temp);
- PyErr_SetString(PyExc_TypeError,
- "%s argument has non-string str()");
- goto onError;
- }
+ if (PyUnicode_Check(temp))
+ /* nothing to do */;
+ else if (PyString_Check(temp)) {
+ /* convert to string to Unicode */
unicode = PyUnicode_Decode(PyString_AS_STRING(temp),
PyString_GET_SIZE(temp),
NULL,
temp = unicode;
if (temp == NULL)
goto onError;
+ }
+ else {
+ Py_DECREF(temp);
+ PyErr_SetString(PyExc_TypeError,
+ "%s argument has non-string str()");
+ goto onError;
+ }
}
pbuf = PyUnicode_AS_UNICODE(temp);
len = PyUnicode_GET_SIZE(temp);