QChar
содержит ushort
в качестве единственного члена, поэтому его размер равен sizeof(ushort)
.
В контексте QString
он представляет "символы" UTF-16 (кодовые точки).
Так что здесь все дело в кодировке.
Если вы знаете, что ваш char const *
представляет собой данные UTF-16 с тем же порядком байтов/порядком байтов, что и ваша система, просто скопируйте его:
memcpy(q, c, 512);
Если вы хотите инициализировать QString
данными const char *
, вы можете просто интерпретировать их как UTF-16, используя QString::fromRawData()
:
QString strFromData = QString::fromRawData(reinterpret_cast<QChar*>(c), 256);
// where 256 is sizeof(c) * sizeof(char) / sizeof(QChar)
Тогда вам даже не нужен массив QChar q[256]
.
Если вы знаете, что ваши данные имеют формат UTF-8, вам следует использовать QString::fromUtf8()
, а затем просто получить доступ к внутренней памяти с помощью QString::constData()
.
Используя QString
с UTF-8, я не знаю ни одного способа полностью предотвратить выделение кучи. Но упомянутый способ должен выделять только дважды: один раз для PIMPL QString
, один раз для строковых данных UTF-16.
Если ваши входные данные закодированы как UTF-8
, ответ Нет: вы не можете преобразовать их с помощью Qt.
Доказательство: просмотр исходного кода qtbase/src/ corelib/codecs/qutfcodec.cpp мы видим, что все функции для кодирования/декодирования создают новых QString
/QByteArray
экземпляров. Никакая функция не работает с двумя массивами, как в вашем вопросе.
person
Martin Hennings
schedule
05.04.2019