C#
定石6:エンコーディング判定の実践— Shift-JISとBOM付きUTF-8の見分け
出典: C# ファイルIO の正解 — StreamReader / File.ReadAllLines / File.ReadLines / using の使い分け — 定石6:エンコーディング判定の実践— Shift-JISとBOM付きUTF-8の見分け
// ✅定石6: BOMの有無で簡易判定(業務系で雑なエンコーディング判定)
public static Encoding DetectEncoding(string path)
{
var bytes = new byte[4];
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
fs.Read(bytes, 0, 4);
}
// UTF-8 BOM (EF BB BF)
if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF)
return Encoding.UTF8;
// UTF-16 BOM (FF FE / FE FF)
if (bytes[0] == 0xFF && bytes[1] == 0xFE)return Encoding.Unicode;
if (bytes[0] == 0xFE && bytes[1] == 0xFF)return Encoding.BigEndianUnicode;
// BOMなし→業務系の典型はShift-JIS(取引先Excel CSV出力等)
return Encoding.GetEncoding("shift_jis");
}
//使う側
var enc = DetectEncoding(@"C:\input\trade.csv");
foreach (var line in File.ReadLines(path, enc))
{
ProcessOneRow(line);
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石6:エンコーディング判定の実践— Shift-JISとBOM付きUTF-8の見分け」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
5 件// ✅定石1: StreamReader + usingでShift-JIS読み込み using System.IO; using System.Text;未収録
定石1: StreamReader + using + Encoding指定
#3070cb2953d8
// ✅定石2: File.ReadAllLinesで一発配列化 using System.IO; using System.Text;未収録
定石2: File.ReadAllLines —小ファイル向きの一撃
#416c419f6cb7
// ✅定石3: File.ReadLinesで大ファイルをストリーム処理 using System.IO; using System.Text;未収録
定石3: File.ReadLines —大ファイルのストリーム読み込み
#275aa66b0c4b
// ✅定石4:性能比較(10万行×約100MBのログを想定) const string path = @"C:\logs\big-app.log"; // ReadAllLines版(メモリに全部ロード)
▶ 実行可
定石4:性能比較— Stopwatch + GC.GetTotalMemory
#976121387821
// ✅定石5: FileShare.ReadWriteで同時アクセスを許可 using System.IO; using System.Text;未収録
定石5: FileShareで同時アクセスを扱う
#6cd0545383e7
