ファイルにはEF BB BFが含まれる場合があります

Unicode文書でUTF-8 BOMはEF BB BFです。UTF-8ではバイト順切替ではなく符号化の署名です。例はこの3バイトにabcの61 62 63を付けた6バイトです。MoyoutilのファイルモードはarrayBufferで元のバイトを読み、テキストモードはTextEncoderでUTF-8にします。

UTF-8 BOMとabcを含む6バイトとBOMなしの3バイトの比較
自作の例示図です。各箱は1バイトで上段6、下段3です。ファイルの画面や実際のユーザーデータではありません。

Unicode: UTF & BOM FAQ

ignoreBOM: trueでは文字が残ります

既定のTextDecoderは先頭BOMを出力から除き、この例ではabcになります。ignoreBOMをtrueにするとBOM処理を省略しU+FEFFが残ります。既定出力の再エンコードは3バイトで、この例のSHA-256は元の6バイトと異なります。すべての編集ソフトやコピー操作に一般化しないでください。

const bytes = Uint8Array.of(0xEF, 0xBB, 0xBF, 0x61, 0x62, 0x63);
new TextDecoder().decode(bytes) === "abc" // true
new TextDecoder("utf-8", {ignoreBOM: true})
  .decode(bytes) === "\uFEFFabc" // true
new TextEncoder().encode(new TextDecoder().decode(bytes)).length // 3

WHATWG: TextDecoder

元ファイルのチェックサム比較にはMoyoutilのファイルモードを使います。見えるabcだけの貼り付けは別の入力です。文字列にU+FEFFが残ればそのバイトもエンコードされます。照合のために元のBOMを勝手に削除せず、アルゴリズムと版を確認してください。

new TextDecoder().decode(Uint8Array.of(0x61, 0xEF, 0xBB, 0xBF))
  === "a\uFEFF" // true

よくある質問

途中のU+FEFFも除去されますか。

この例では先頭だけを除き、途中のU+FEFFは残ります。ignoreBOM: trueなら先頭も残ります。下のコードと空入力を実行して確認しました。