Конвертировать массив многобайтовых символов в массив QChar - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть два буфера (примерные размеры):

char c[512];
QChar q[256];

Предполагается, что 'c' содержит многобайтовую строку символов (UTF-8).Мне нужно преобразовать его в последовательность QChar и поместить в 'q'.Полагаю, хорошим примером того, что мне нужно, может быть MultiByteToWideChar функция.
ВАЖНО: эта операция не должна включать какие-либо явные или неявные выделения памяти, за исключением, возможно, дополнительных выделений в стеке.Пожалуйста, не отвечайте, если вы не уверены, что означает вышеуказанное.

1 Ответ

0 голосов
/ 05 апреля 2019

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 экземпляры.Ни одна функция не работает с двумя массивами, как в вашем вопросе.

...