Проверьте правильность строки UTF-8 в Qt

В Qt существует ли способ проверить, является ли байтовый массив правильной последовательностью UTF-8?

Кажется, что QString:: fromUtf8() тихо подавляет или заменяет недопустимые последовательности, не уведомляя вызывающего, что они есть. Это из документации:

Однако недопустимые последовательности возможны с UTF-8 и, если таковые имеются, они будут заменены одним или больше "замещающих символов" или подавлено.

Ответ 1

Попробуйте QTextCodec:: toUnicode и передайте экземпляр ConverterState. У ConverterState есть члены как invalidChars. Однако они не документируются через doxygen, но я предполагаю, что они являются общедоступными API, как они упоминаются в документации QTextCodec.

Пример кода:

QTextCodec::ConverterState state;
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
const QString text = codec->toUnicode(byteArray.constData(), byteArray.size(), &state);
if (state.invalidChars > 0) {
    qDebug() << "Not a valid UTF-8 sequence.";
}

Ответ 2

ConverterState способ, о котором уже сообщалось здесь от Фрэнка Остерфелда, работает, даже если в тексте нет "спецификации (байтового байта)" (*).

(*) В отличие от QTextCodec::codecForUtfText(), которому требуется спецификация в тексте, чтобы знать, что это в Utf-8.