2011-09-23 13 views
5

バイト配列(chars)へのポインタ形式の文字列を指定すると、C/C++で文字列のエンコーディングを検出できますか(Visual Studio 2008を使用しましたか? ?私は検索をしましたが、ほとんどのサンプルはC#で行われます。あなたが入力配列の長さを知っていると仮定すると、C/C++で文字列のエンコーディングを検出する

おかげで

+0

これはANSI対UCS2ですか? –

+0

期待するエンコードは何ですか?可能なものの小さなコレクションはありますか、それはちょうど何かになりますか? –

+0

どのような環境を使用していますか?私は、Windows上で移植可能な、Linux上でこれを行うライブラリがあると思います。 –

答えて

6

、次推測することができます:

  1. は、まず、最初の数バイトがbyte order marks (BOM) for Unicodeを知っている任意のよく一致するかどうかを確認します。もしそうなら、あなたは終わった!
  2. 次に、最後のバイトの前に '\ 0'を検索します。見つけた場合は、UTF-16またはUTF-32を扱っている可能性があります。複数の '\ 0'が連続している場合は、おそらくUTF-32でしょう。
  3. 0x80から0xffまでの文字は、ASCIIまたはUTF-7ではありません。 Unicodeの変種に入力を制限している場合は、それをUTF-8とみなすことができます。それ以外の場合は、それがどれであるかを判断するためにいくつかの推測をしなければなりません。それは楽しいことではありません。
  4. この時点では、ASCII、UTF-7、Base64、またはUTF-16またはUTF-32の範囲のいずれかで、ちょうどトップビットを使用せず、ヌル文字もありません。
3

それが解決する簡単な問題ではない、と一般的に比較的無害な入力によってアップトリップすることができます入力エンコーディングが何であるかせいぜい推測を、取るためにヒューリスティックに依存している - 例えば、this Wikipedia articleを見て、詳細についてはThe Notepad file encoding Reduxをご覧ください。

最小限の依存性を持つWindows専用ソリューションをお探しの場合は、IsTextUnicodeとMLangのDetectInputCodePageの組み合わせを使用して、文字セットの検出を試みることができます。

移植性を探していても、ICUの形でかなり大きな依存関係を取っても構わないのであれば、移植可能な方法で同じことを達成するためにはcharacter set detectionルーチンを利用することができます。

関連する問題