Java の Charset のバイトオーダーとBOM

Java のサポートされているエンコーディングの一覧を見ていると、UTF-16, UTF-16BE, UTF-16LE, x-UTF-16LE-BOM とあって、なにが違うんだろうと思って調べてみました。

まとめると、読み・書き時のバイトオーダー (BO) 1 と書き込み時の BOM (Byte Order Mark) の違いでした。

  • 読み込み時のバイトオーダー
    • BE / LE が付かないものは、BOM から自動的に判定
  • 書き込み時のバイトオーダー
    • BE / LE が付かないものは、BIG バイトオーダー
  • BOM の有無
    • UTF-8 に「BOM あり」で書き込むものはない2
名称 読み込み時
バイトオーダー
書き込み時
バイトオーダー
書き込み時
BOM
UTF-8 - - x
UTF-16 AUTO BIG o
UTF-16BE BIG BIG x
UTF-16LE LITTLE LITTLE x
x-UTF-16LE-BOM AUTO LITTLE o
UTF-32 AUTO BIG x
UTF-32BE BIG BIG x
X-UTF-32BE-BOM BIG BIG o
UTF-32LE LITTLE LITTLE x
X-UTF-32LE-BOM LITTLE LITTLE o

  1. バイトオーダー = エンディアン

  2. バイトオーダーに関わらず同じ内容になるので、本来は UTF-8 に BOM (Byte Order Mark) は不要