2013-08-14 2 views
10

In Qt, c'è un modo per verificare se una matrice di byte è una sequenza UTF-8 valida?Verificare se la stringa UTF-8 è valida in Qt

Sembra che QString::fromUtf8() sopprima o sostituisca silenziosamente le sequenze non valide, senza avvisare il chiamante che ce ne sono. Questo è da sua documentazione:

Tuttavia, le sequenze non validi sono possibili con UTF-8 e, se tale si trovano, saranno sostituiti con uno o più "caratteri di sostituzione", o soppressa.

+0

Sospetto che per verificare la validità di una stringa UTF8, sarà necessario utilizzare una libreria Unicode. –

+0

Ho trovato questo snippet di codice: [https://github.com/JulienPalard/is_utf8]. Potrebbe essere utile. –

+0

Il collegamento mi dà "Pagina non trovata" – sashoalm

risposta

13

Provare con QTextCodec::toUnicode e passare un'istanza ConverterState. ConverterState ha membri come invalidChars. Non sono documentati tramite doxygen, ma presumo che siano API pubbliche, come menzionato nella documentazione di QTextCodec.

codice di esempio:

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."; 
} 
+1

Grazie, questo mi ha indirizzato nella giusta direzione. Risulta che c'è un modo ancora più semplice usando [QTextCodec :: codecForUtfText()] (http://qt-project.org/doc/qt-4.8/qtextcodec.html#codecForUtfText), che consente di specificare un codec predefinito se no La codifica UTF è adatta per il testo. Ho specificato [QTextCodec :: codecForLocale()] (http://qt-project.org/doc/qt-4.8/qtextcodec.html#setCodecForLocale) come codec predefinito. – sashoalm

2

Il ConverterState modo, che è già stata segnalata here da Frank Osterfeld, funziona anche se il testo non ha una "BOM (Byte Order Mark)" (*).

(*) A differenza di QTextCodec::codecForUtfText(), che ha bisogno di una BOM nel testo per sapere che è in Utf-8.