ホームページ >バックエンド開発 >C++ >バイト オーダー マーク (BOM) を使用してファイルのエンコーディングを確実に判断する方法

バイト オーダー マーク (BOM) を使用してファイルのエンコーディングを確実に判断する方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-17 01:32:09426ブラウズ

How to Reliably Determine a File's Encoding Using its Byte Order Mark (BOM)?

ファイルのエンコーディングを正確に識別する: 実践的な方法

ファイルエンコーディングを正しく識別することは、テキスト処理にとって非常に重要です。ただし、StreamReader.CurrentEncoding 属性では正確な結果が得られないことがよくあります。この問題を解決するためのより信頼性の高い方法は、ファイルのバイト オーダー マーク (BOM) を分析することです。

BOMの役割

BOM は、テキスト ファイルのエンディアンとエンコーディングを示すバイトのシーケンスです。一般的な BOM には次のものが含まれます:

  • UTF-8: EF BB BF
  • UTF-16LE: FF FE
  • UTF-16BE: FE FF
  • UTF-32LE: FF FE 00 00
  • UTF-32BE: 00 00 FE FF
  • ASCII: BOM なし

BOM に基づいてファイルエンコーディングを決定します

次の C# コードは詳細な実装を提供します:

<code class="language-csharp">public static Encoding GetEncoding(string filename)
{
    // 读取 BOM
    byte[] bom = new byte[4];
    using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))
    {
        file.Read(bom, 0, 4);
    }

    // 分析 BOM
    if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) return Encoding.UTF7;
    if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) return Encoding.UTF8;
    if (bom[0] == 0xff && bom[1] == 0xfe && bom[2] == 0 && bom[3] == 0) return Encoding.UTF32; //UTF-32LE
    if (bom[0] == 0xff && bom[1] == 0xfe) return Encoding.Unicode; //UTF-16LE
    if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE
    if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) return new UTF32Encoding(true, true);  //UTF-32BE

    // 如果未检测到 BOM,则回退到 ASCII
    return Encoding.ASCII;
}</code>

この方法を使用すると、テキスト ファイルのエンコーディングを正確に識別し、正しいデータ解釈とテキスト処理を保証できます。

以上がバイト オーダー マーク (BOM) を使用してファイルのエンコーディングを確実に判断する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。