From ddbd93680730811a5020b4d429c2e3e11d6823e3 Mon Sep 17 00:00:00 2001 From: Boxiang Sun Date: Sat, 28 Apr 2018 09:53:49 +0800 Subject: Improve sbkstring::toCString to support unicode If `unicode` is used in Python 2, shiboken cannot properly translate it to `const char *`. sbkstring did not supported a proper conversion of unicode types in Python2, and this change includes it. Task-number: PYSIDE-100 Change-Id: I3a70d935ad61b0e567e620c62754800370270a6b Reviewed-by: Qt CI Bot Reviewed-by: Alexandru Croitor --- sources/pyside2/tests/QtCore/unicode_test.py | 5 +++++ sources/shiboken2/libshiboken/sbkstring.cpp | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) (limited to 'sources') diff --git a/sources/pyside2/tests/QtCore/unicode_test.py b/sources/pyside2/tests/QtCore/unicode_test.py index 3326e2e0e..f44a00c62 100644 --- a/sources/pyside2/tests/QtCore/unicode_test.py +++ b/sources/pyside2/tests/QtCore/unicode_test.py @@ -35,6 +35,7 @@ import unittest import py3kcompat as py3k from PySide2.QtCore import QObject +from PySide2.QtCore import QByteArray class UnicodeConversion(unittest.TestCase): '''Test case for QString to/from Python Unicode conversion''' @@ -57,6 +58,10 @@ class UnicodeConversion(unittest.TestCase): obj.setObjectName(py3k.unicode_('ümlaut')) self.assertEqual(obj.objectName(), py3k.unicode_('ümlaut')) + def testTranslateUnicode(self): + ba = QByteArray(py3k.unicode_('0123456789')) + self.assertEqual(ba.__str__(), py3k.unicode_('0123456789')) + if __name__ == '__main__': unittest.main() diff --git a/sources/shiboken2/libshiboken/sbkstring.cpp b/sources/shiboken2/libshiboken/sbkstring.cpp index b92674383..6ca35f12e 100644 --- a/sources/shiboken2/libshiboken/sbkstring.cpp +++ b/sources/shiboken2/libshiboken/sbkstring.cpp @@ -99,18 +99,24 @@ const char* toCString(PyObject* str, Py_ssize_t* len) { if (str == Py_None) return NULL; -#ifdef IS_PY3K if (PyUnicode_Check(str)) { if (len) { // We need to encode the unicode string into utf8 to know the size of returned char*. Shiboken::AutoDecRef uniStr(PyUnicode_AsUTF8String(str)); *len = PyBytes_GET_SIZE(uniStr.object()); } +#ifdef IS_PY3K // Return unicode from str instead of uniStr, because the lifetime of the returned pointer // depends on the lifetime of str. return _PepUnicode_AsString(str); - } +#else + str = PyUnicode_AsUTF8String(str); + if (str == NULL) { + return NULL; + } + return PyString_AsString(str); #endif + } if (PyBytes_Check(str)) { if (len) *len = PyBytes_GET_SIZE(str); -- cgit v1.2.3