1. ホーム
  2. c#

[解決済み] ファイルのエンコードを検索する効率的な方法

2022-05-11 04:18:09

質問

よくある質問なのですが、私自身あまり知識がないため漠然としています。

しかし、私はファイルのエンコードを見つけるために非常に正確な方法が必要です。 Notepad++がそうであるように、とても正確です。

どのように解決するのですか?

その StreamReader.CurrentEncoding プロパティは、私にとって正しいテキストファイルのエンコーディングを返すことはほとんどありません。私は、ファイルのエンディアンを決定するために、そのバイトオーダーマーク(BOM)を分析することで、より大きな成功を収めました。ファイルにBOMがない場合、ファイルのエンコーディングは決定できません。

*UTF-32LEを検出し、UTF-32BEに対して正しいエンコーディングを返すようにUPDATED 4/08/2020 を含む。

/// <summary>
/// Determines a text file's encoding by analyzing its byte order mark (BOM).
/// Defaults to ASCII when detection of the text file's endianness fails.
/// </summary>
/// <param name="filename">The text file to analyze.</param>
/// <returns>The detected encoding.</returns>
public static Encoding GetEncoding(string filename)
{
    // Read the BOM
    var bom = new byte[4];
    using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))
    {
        file.Read(bom, 0, 4);
    }

    // Analyze the 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

    // We actually have no idea what the encoding is if we reach this point, so
    // you may wish to return null instead of defaulting to ASCII
    return Encoding.ASCII;
}