Qtでは、バイト配列が有効なUTF-8シーケンスであるかどうかをチェックする方法はありますか?QtでUTF-8文字列が有効であることを確認してください
QString::fromUtf8()は、呼び出し元に通知しなくても、無効なシーケンスを暗黙に抑制または置き換えているようです。これは、そのドキュメントからです:
しかし、無効なシーケンスが UTF-8で可能であり、いかなるなどが発見された場合、彼らは、1つまたは 以上「置換文字」に置き換えられ、または抑制されます。
Qtでは、バイト配列が有効なUTF-8シーケンスであるかどうかをチェックする方法はありますか?QtでUTF-8文字列が有効であることを確認してください
QString::fromUtf8()は、呼び出し元に通知しなくても、無効なシーケンスを暗黙に抑制または置き換えているようです。これは、そのドキュメントからです:
しかし、無効なシーケンスが UTF-8で可能であり、いかなるなどが発見された場合、彼らは、1つまたは 以上「置換文字」に置き換えられ、または抑制されます。
QTextCodec::toUnicodeで試して、ConverterStateインスタンスを渡してください。 ConverterStateにはinvalidChars
のようなメンバーがあります。彼らはdoxygenを介して文書化されていませんが、QTextCodecのドキュメントで言及されているように、それらを公開APIにすると仮定します。
サンプルコード:
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.";
}
ありがとう、それは正しい方向に私を入れてください。 [QTextCodec :: codecForUtfText()](http://qt-project.org/doc/qt-4.8/qtextcodec.html#codecForUtfText)を使用するとさらに簡単な方法があります。 UTFエンコーディングはテキストに適しています。私はデフォルトのコーデックとして[QTextCodec :: codecForLocale()](http://qt-project.org/doc/qt-4.8/qtextcodec.html#setCodecForLocale)を指定しました。 – sashoalm
すでにフランク・オスタッフェルドでhereを報告されているConverterState
方法は、テキストは「BOM(バイトオーダーマーク)」(*)を持っていない場合でも動作します。
(*)Utf-8にあることを知るために、テキストにBOMが必要なQTextCodec::codecForUtfText()
とは異なります。
私はUTF8文字列の有効性をチェックすると思われますが、Unicodeライブラリを使用する必要があります。 –
このコードスニペットが見つかりました:[https://github.com/JulienPalard/is_utf8]。それは役に立つかもしれない。 –
リンクは私に「ページが見つかりません」と答えています – sashoalm