Проверьте правильность строки 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.