2012-02-01 9 views
4

C++でUTF-8であるかどうかを調べるためにByte Order Markファイルを調べる方法を知りましたか?C++ UTF-8であるかどうかを調べるためにファイルByte Order Markを検査する方法?

+2

問題は何ですかを参照してください、署名/ unsigned char型の問題を回避するために、buffer[0] == '\xEF'代わりのbuffer[0] == 0xEFを使用することをお勧めしますか? 0xEF、0xBB、0xBFと比較するだけです。私はあなたの問題の詳細を述べる必要があると思います。 –

+0

これは多少の関連性があります:http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 – NPE

+3

どの言語でも同じことが言えます。あなたは最初の3バイトを取得します。 Unicode Byte Order MarkのUTF-8バイトのように見える場合は、UTF-8です。もしそうでなければ、そうではありません。あなたのためにソースコードを書く人を頼んでいますか? –

答えて

4

0xEFという、0xBB、0xbfの

順序は、エンディアンに依存しません。

C++でファイルを読む方法はあなた次第です。個人的に私はまだCスタイルのFileメソッドを使用しています。なぜなら、それらは私がコーディングしているライブラリによって提供されており、バイナリモードを指定して、意図しない翻訳を避けることができるからです。デフォルトで

cs.vt.edu

#include <fstream> 
... 
char buffer[100]; 
ifstream myFile ("data.bin", ios::in | ios::binary); 
myFile.read (buffer, 3); 
if (!myFile) { 
    // An error occurred! 
    // myFile.gcount() returns the number of bytes read. 
    // calling myFile.clear() will reset the stream state 
    // so it is usable again. 
} 
... 
if (!myFile.read (buffer, 100)) { 
    // Same effect as above 
} 
if (buffer[0] == 0XEF && buffer[1] == 0XBB && buffer[2] == 0XBF) { 
    //Congrats, UTF-8 
} 

から適合

あるいは、多くの形式使用UTF-8は他のBOM(UTF-16、またはUTF-32例えば)が指定されていない場合。一般的に

wiki for BOM

unicode.org.faq

+2

'#include '?あなたのコンパイラは何歳ですか? –

+0

@AndréCaronはあまりにも古くて、たくさんのコードを実行するためにバグが多いので、他の人たちを時折修正しようとします。 – John

9

、あなたがすることはできません。

バイトオーダーマークが存在することは、読んでいるファイルがユニコードであることを強く示しています。テキストファイルが必要な場合は、最初の4バイトは次のようになります。

0x00, 0x00, 0xfe, 0xff -- The file is almost certainly UTF-32BE 
0xff, 0xfe, 0x00, 0x00 -- The file is almost certainly UTF-32LE 
0xfe, 0xff, XX, XX  -- The file is almost certainly UTF-16BE 
0xff, 0xfe, XX, XX (but not 00, 00) -- The file is almost certainly UTF-16LE 
0xef, 0xbb, 0xbf, XX -- The file is almost certainly UTF-8 With a BOM 

他に何がありますか?あなたが得るバイトがこれらの5つのパターン以外のものであれば、あなたのファイルがUTF-8であるかどうかを特定することはできません。

実際、0x00〜0x7fのASCII文字のみを含むテキスト文書は、有効なUTF-8文書であり、平易なASCII文書です。

文書がISO-8859-1、UTF-8、またはCP1252などでエンコードされているかどうかに基づいて、見られる特定の文字に基づいて推論することができるヒューリスティックがありますが、最初の2バイト、3バイト、または4バイトのファイルでは、あなたが見ているものが間違いなくUTF-8であるかどうかは分かりません。

+0

"(ただし00:00ではない)"は、UTF-16BEとUTF-16LEの両方に適用されるのでしょうか? –

+0

fe ff 00 00はUTF16-BEであり、UTF32ではありません。 UTF-32では、U + FFFEを表します。これは非文字であり、Unicodeドキュメントには存在しないはずです。 UTF-16BEでは、BOMの後ろにヌル文字が続きます –

3
if (buffer[0] == '\xEF' && buffer[1] == '\xBB' && buffer[2] == '\xBF') { 
    // UTF-8 
} 

それはHow do I represent negative char values in hexadecimal?

+0

ifstream.read(..)(not get())とBOMバイトが一致するためのcharリテラルの組み合わせを使用する必要がありました。乾杯! –

関連する問題