diff options
author | Boxiang Sun <daetalusun@gmail.com> | 2018-04-28 09:53:49 +0800 |
---|---|---|
committer | Boxiang Sun <daetalusun@gmail.com> | 2018-06-01 13:15:17 +0000 |
commit | ddbd93680730811a5020b4d429c2e3e11d6823e3 (patch) | |
tree | 4a273068d222560b2414f903faf35762802abede /sources | |
parent | 807183092b19b5df07a0630a78ebe534ba38a7b2 (diff) |
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 <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'sources')
-rw-r--r-- | sources/pyside2/tests/QtCore/unicode_test.py | 5 | ||||
-rw-r--r-- | sources/shiboken2/libshiboken/sbkstring.cpp | 10 |
2 files changed, 13 insertions, 2 deletions
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); |