2013-08-14 16 views
10

Qtでは、バイト配列が有効なUTF-8シーケンスであるかどうかをチェックする方法はありますか?QtでUTF-8文字列が有効であることを確認してください

QString::fromUtf8()は、呼び出し元に通知しなくても、無効なシーケンスを暗黙に抑制または置き換えているようです。これは、そのドキュメントからです:

しかし、無効なシーケンスが UTF-8で可能であり、いかなるなどが発見された場合、彼らは、1つまたは 以上「置換文字」に置き換えられ、または抑制されます。

+0

私はUTF8文字列の有効性をチェックすると思われますが、Unicodeライブラリを使用する必要があります。 –

+0

このコードスニペットが見つかりました:[https://github.com/JulienPalard/is_utf8]。それは役に立つかもしれない。 –

+0

リンクは私に「ページが見つかりません」と答えています – sashoalm

答えて

13

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

ありがとう、それは正しい方向に私を入れてください。 [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

2

すでにフランク・オスタッフェルドでhereを報告されているConverterState方法は、テキストは「BOM(バイトオーダーマーク)」(*)を持っていない場合でも動作します。

(*)Utf-8にあることを知るために、テキストにBOMが必要なQTextCodec::codecForUtfText()とは異なります。

関連する問題