2013-08-14 13 views
10

W Qt, czy istnieje sposób sprawdzenia, czy tablica bajtów jest prawidłową sekwencją UTF-8?Sprawdź, czy ciąg znaków UTF-8 jest poprawny w Qt

Wygląda na to, że QString::fromUtf8() w trybie cichym pomija lub zastępuje nieprawidłowe sekwencje, bez powiadamiania osoby dzwoniącej o tym fakcie. To z jego dokumentacji:

Jednak nieważne sekwencje są możliwe UTF-8, a jeżeli takie występują, będą one zastąpić jeden lub więcej „ znaków zamiennych” lub stłumione.

+0

Podejrzewam, że aby sprawdzić poprawność ciągu znaków UTF8, należy użyć biblioteki Unicode. –

+0

Znalazłem ten fragment kodu: [https://github.com/JulienPalard/is_utf8]. To może być przydatne. –

+0

Link daje mi "Nie odnaleziono strony" – sashoalm

Odpowiedz

13

Spróbuj z QTextCodec::toUnicode i przechodzącą instancji ConverterState. ConverterState ma członków takich jak invalidChars. Nie są one jednak dokumentowane przez doxygen, ale zakładam, że są one publicznymi API, o czym wspomina dokumentacja QTextCodec.

Przykładowy kod:

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

Dzięki, że postawiłem mnie w dobrym kierunku. Okazuje się, że istnieje jeszcze prostszy sposób używania [QTextCodec :: codecForUtfText()] (http://qt-project.org/doc/qt-4.8/qtextcodec.html#codecForUtfText), który pozwala określić domyślny kodek, jeśli nie Kodowanie UTF jest odpowiednie dla tekstu. Podałem [QTextCodec :: codecForLocale()] (http://qt-project.org/doc/qt-4.8/qtextcodec.html#setCodecForLocale) jako domyślny kodek. – sashoalm

2

ConverterState sposób, które zostały już zgłoszone here Frank Osterfeld, działa nawet jeśli tekst nie dostał "BOM (Byte Order Mark)" (*).

(*) W przeciwieństwie do QTextCodec::codecForUtfText(), która potrzebuje BOM w tekście, aby wiedzieć, że jest w Utf-8.

Powiązane problemy