2016-09-01 1 views
1

C++で書かれたWindowsアプリケーションで入力UTF-8シーケンスを検証したいと思います。Windows C++アプリケーションで入力UTF-8シーケンスを検証する

私の考えは、MultiByteToWideChar()を呼び出すだけで、目的の文字列の長さを(文字列変換全体をUTF-16にするのではなく)要求し、MB_ERR_INVALID_CHARSフラグを使用していました。
次に、関数が0(失敗を意味する)を返し、GetLastError()ERROR_NO_UNICODE_TRANSLATIONを返した場合、入力UTF-8シーケンスに無効なデータが含まれている可能性があります。

良いアプローチがありますか?

+0

あなたは「より良い」*を求めているので、どの面を改善する必要がありますか? – IInspectable

+0

@IInspectable:もっと良い解決策がなければ、私は自分のものとうまくいっています。より速く、またはいくつかの_ad hoc_ APIを使用して検証することができます(私の理解はMBTWCが翻訳を念頭に置いて設計されており、必要なものがUTF-8の検証であればオーバーヘッドが生じる可能性があるためです)。 –

答えて

0

MBTWCの内部を知らなくても、より良いアプローチを指定するのは難しいでしょう。それは、MBTWCの使用と代替アプローチ(より速いものがより良いと考えられる場合)のタイミング測定を少なくとも必要とするだろう。独自のUTF-8バリデーターを実装することは、比較を可能にする開始点になります。あなたは良いリファレンス実装hereを見つけることができます、受け入れられた答えを見てください。 JavaコードはC++にかなり簡単に変換され、(あなたのケースでは)より良いかどうかを判断し、必要に応じてさらに改良を加えるための十分な機会が与えられます。

+0

* "MBTWCの内部を知らない" * - あなたは内部のいくつかを知っています**。そのために、 'MultiByteToWideChar'は必然的に各コードポイントのUTF-16エンコーディングの長さを推測する必要があります。おそらく1または2のいずれかを返す些細な比較だが、入力を検証するだけでなく、実行する必要があることもある。 – IInspectable