2009-08-05 5 views

答えて

4

信頼性が低くなります。被験者のRaymond Chenのseriespostsを参照してください。

問題は、BOMを持たないUTF-8はすべて、同じように有効なANSIエンコーディングと見分けがたくなることです。私はほとんどのソリューション(win32 API IsTextUnicodeのような)は、テキストのフォーマットを推測するために様々な経験則を使用していると思います。

+2

BOMの場合、それはまだ区別できません。したがって、BOMは積極的に有害であることに加えて役に立たない。 –

6

あなたはそれが可能であるという仮説をテストすることができますが、確信が持てないということを知ることしかできません。つまり、バッファを調べて、すべてのバイトシーケンスが有効なUTF-8であるかどうか、コードポイントが最小バイト数で表されているかどうか、16ビットサロゲートコードが存在しないかどうかなどを調べることができます。これらの基準をすべて満たすバッファはテキストのように見えますが、あなたはだまされる可能性があります。

Mark Pim氏の答えであるOld New ThingのRaymond Chenディスカッションに加えて、バッファには実際には7ビットの印刷可能なASCIIと思われるサブセットに制限されるx86マシンコードが実際に含まれている可能性があります。驚いたことに、実際にそのサブセットに意味のあるプログラムを書くことができます。その一例は、EICARウイルス対策テストウイルスです。

もちろん、不正な形式のUTF-8であるバイト列を含むバッファは、おそらくUTF-8テキストではありません。その場合、あなたは高い信頼度を持っています。次に、実際にどのようなエンコードが行われるかを把握することです。

バッファのセマンティックコンテンツについて何か知っている(または想定している)場合は、それを使用して決定をサポートすることもできます。たとえば、バッファに英語のテキストが含まれていると想定されている場合は、その中に韓国語のコードポイントを持つことはほとんどありません。また、一般的に正しいスペル、英語の文法などに従ってください。これはもちろん、テストには高価になる可能性があります。

0

素早く汚れている場合は、this pageの正規表現よりもはるかに優れていません。バイトをUTF-8としてデコードするのが安全かどうかを知りたいだけなら、それだけで十分です。

0

バイトシーケンスがUTF-8として有効であることを単にテストします。そうであれば、それが他の符号化において意味のあるテキストである確率は本質的にゼロである。

関連する問題