Как я могу разделить wchar_t / TCHAR / WCHAR / LPTSTR в QStringList?
Работая с Win32API, функция, которую я должен использовать, возвращает свои результаты, записывая их в буфер типа LPTSTR, а также индивидуальное количество символов, которые были написаны. Введите код здесь
Поскольку этот буфер является строкой, и функция может возвращать несколько значений, фактические данные результата выглядят примерно так:
Value1\0Value2\0Value3\0\0
Каков наилучший способ получить это в QStringList?
1 ответ
LPTSTR = длинный указатель на TCHAR. В современных системах (с поддержкой Unicode) это синонимично с массивом WCHAR.
Поскольку ваш выходной буфер будет содержать символы, каждый из которых по два байта, он, таким образом, совместим с UTF16.
QString имеет статический метод fromUtf16, который требует простого приведения для удовлетворения компилятора.
В этом случае мы ДОЛЖНЫ также указать общую длину всей строки. Невыполнение этого требования приводит к тому, что QString только читает входные данные вплоть до первого нулевого символа, игнорируя любые другие данные результата.
Как только мы действительно получим QString для работы, разделить его будет просто. Вызвать метод split() QString, указав нулевой символ, заключенный в QChar.
Необязательно, и требуется в моем случае, указание SplitBehavior как SkipEmptyParts гарантирует, что никакие пустые строки (результат анализа нулевого символа) не окажутся в моем желаемом результате (QStringList значений).
Пример:
// The data returned by the API call.
WCHAR *rawResultData = L"Value1\0Value2\0Value3\0";
// The number of individual characters returned.
quint64 numberOfWrittenCharacters = 22;
// Create a QString from the returned data specifying
// the size.
QString rString =
QString::fromUtf16((const ushort *)rawResultData, numberOfWrittenCharacters);
// Finally, split the string into a QStringList
// ignoring empty results.
QStringList results =
rString.split(QChar(L'\0'), QString::SkipEmptyParts);