2011-10-24 3 views
2

エンコーディング(ASCIIまたはUnicode)がわからないテキストファイルを読むにはどうすればよいですか?C++でエンコーディングが不明なテキストファイルを読む

エンコードを自動検出するクラスがありますか?

+0

あなたはどのようなテキストエディタを使用しています? – Swiss

+0

テキストエディタではなく、C++クラスを使用しています –

+4

@angela:これは信頼性の高い方法ではありませんエンコーディングはそのデータをどのように解釈するかを指示しますコンピュータが特定の解釈が正しいかどうかを –

答えて

6

私はここで否定的な答えしか出せません:ファイルのエンコーディングを決定する普遍的な正しい方法はありません。 ASCIIファイルは、ASCIIがサブセットであるため、ISO-8859-15エンコーディングとして読み取ることができます。他のファイルについては、さらに悪いことに、両方で異なる意味を持つ2つの異なるエンコーディングで有効である可能性があります。したがって、他の手段でこの情報を入手する必要があります。多くの場合、すべてがUTF8であると仮定するのは良いアプローチです。 * NIX環境で作業している場合は、LC_CTYPE変数が役立ちます。エンコーディングを気にしない場合(たとえば、コンテンツを変更または処理しない場合)、ファイルをバイナリとして開くことができます。行う方法(ブルートフォース)の

+0

多くの場合、エンコーディングがわかっていても(十分に短い)スニペットが入っている言語を伝えることさえできません:) –

0

一つは

  • は、適切なエンコーディングのリストを構築することができ
  • エンコードテキストすべてと考えエンコーディングを超える(のみISO-コードページおよびUnicode)
  • 反復エラーがエン覚えていない場合は
  • のエラーの結果を比較し
  • エンコード、それをバックユニコード
  • このエンコーディングを使用してあなたは、着信エンコーディングがANSIまたはUnicodeであることを確信しているなら、あなたもbyte order markをチェックすることができるhttp://www.codeproject.com/KB/recipes/DetectEncoding.aspx

    :最少のバイト

リファレンスを生成コーディング。しかし、それは完全な証明ではないことを教えてください。

+0

これは理論的にはここに答えの本質的な部分を含め、参考にするためのリンクを提供することが望ましいでしょう(http://meta.stackexchange.com/q/8259)。 –

+0

ありがとうございました。私はそれに応じて答えを編集しました。 – krammer

1

これは一般的なケースでは不可能です。ファイルに正確に を入力している場合は、ASCII、UTF-8、または ISO 8859のいずれかと同じように有効です。いくつかのヒューリスティックしかし 、推測として使用することができる。

  1. ブロックのいずれかにBOMで始まるかどうかを確認し、次 ために、その後、最初の「ページ」(512バイト程度)を読み取りますUnicode 形式
  2. 最初の4バイトを見てください。 '\0', other, '\0', other UTF16BE other, '\0', other, '\0' UTF16LE '\0', '\0', '\0', other UTF32BE :彼らは0'` \ ' `含まれている場合は、次の パターンに応じて、UTF-16またはUTF-32のいくつかのフォームを扱う おそらくですother, '\0', '\0', '\0' UTF32RLE
  3. トップビットが設定されたバイトを探します。これが正当な UTF-8文字の開始点である場合、そのファイルはおそらくUTF-8になります。そうでなければ... で、私が働いた地域は、ISO 8859-1が一般的には と思われます。
  4. そうでなければ、 が最上位ビットがセットされたバイト(その時点で の以前のヒューリスティックを使用する)まで、ASCIIを仮定する必要があります。

しかし、私が言ったように、100%確実ではありません。

(PS。どのように私はここにテーブルをフォーマットします。ポイント2内のテキストをHTMLテーブル として宣言されているが、それは1として表示されていないようです。

関連する問題