diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-28 14:55:48 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-28 19:46:53 +0200 |
| commit | 882cc75ad73de727fe185d8355b6b450989d0fba (patch) | |
| tree | ffc546b937eff146a9399d359d236bad903b9908 /sources/pyside6/libpyside/pyside.cpp | |
| parent | b0871930b2437c88ac1812e1f87a7ee428a8bf1b (diff) | |
libpyside: Move the UNICODE conversion into the library
Task-number: PYSIDE-1898
Change-Id: I8ed11bb3f46a5e26adf8bcb7aa3f083adde40628
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/pyside6/libpyside/pyside.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pyside.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp index a376e2837..39b20120d 100644 --- a/sources/pyside6/libpyside/pyside.cpp +++ b/sources/pyside6/libpyside/pyside.cpp @@ -704,17 +704,32 @@ PyObject *getWrapperForQObject(QObject *cppSelf, PyTypeObject *sbk_type) return pyOut; } +QString pyUnicodeToQString(PyObject *str) +{ + Q_ASSERT(PyUnicode_Check(str) != 0); + + const void *data = _PepUnicode_DATA(str); + const Py_ssize_t len = PyUnicode_GetLength(str); + switch (_PepUnicode_KIND(str)) { + case PepUnicode_1BYTE_KIND: + return QString::fromLatin1(reinterpret_cast<const char *>(data), len); + case PepUnicode_2BYTE_KIND: + return QString::fromUtf16(reinterpret_cast<const char16_t *>(data), len); + case PepUnicode_4BYTE_KIND: + break; + } + return QString::fromUcs4(reinterpret_cast<const char32_t *>(data), len); +} + // Inspired by Shiboken::String::toCString; QString pyStringToQString(PyObject *str) { if (str == Py_None) return QString(); - if (PyUnicode_Check(str)) { - const char *unicodeBuffer = _PepUnicode_AsString(str); - if (unicodeBuffer) - return QString::fromUtf8(unicodeBuffer); - } + if (PyUnicode_Check(str) != 0) + return pyUnicodeToQString(str); + if (PyBytes_Check(str)) { const char *asciiBuffer = PyBytes_AS_STRING(str); if (asciiBuffer) |
