Delphi 2009 が届き ソースが見られるようになったので、BOM の扱いを調べて見ました。
#ヘルプを見てもさっぱりなので...(^^;
1) TStrings.LoadFromStream/SaveToStream の Encoding を指定しない時の動作
TStrings.LoadFromStream は Encoding を省略すると BOM を見て Encoding を決めます。
A) BOM が LE UTF-16 なら LE UTF-16 としてストリームを読む。
B) BOM が BE UTF-16 なら BE UTF-16 としてストリームを読む。
C) BOM が UTF-8(BOM付き) なら UTF-8(BOM付き)としてストリームを読む。
D) BOM が LE UTF-16/BE UTF-16/UTF-8(BOM付き) のいずれでもないなら
BOM無しのANSIのデフォルトのコードページとしてストリームを読む。
つまり自動判別では、ユニコード系の BOM 無しはサポートされていません。
#BOMのみで判断してるので当然ですが...
TStrings.SaveToStream は Encoding を省略すると BOM無しのANSIのデフォルトの
コードページでストリームに文字列を書き込みます。
2) TStrings.LoadFromStream/SaveToStream の Encoding 指定時の動作
Encoding を省略しない場合、TEncoding に従ってストリームの読み書きが行われますが、
TEncoding.Unicode, TEncoding,BigEndianUnicode, TEncoding.UTF8 が返すユニコード系の
エンコーディングのクラス、TUnicodeEncoding, TBigEndianUnicodeEncoding, TUTF8Encoding
はいずれもBOM 付きです。
TStrings.LoadFromStreamでは BOM付きのエンコーディングが指定された場合、BOMがチェックされ、
BOMが無かった場合は BOM無しとして読み込まれます。もちろんBOMが有った場合は BOMを読み飛ばして
読み込まれます。
TStrings.SaveToStreamは指定されたエンコーディングに従って BOMの有無と内容を切り替えます。
3) BOM無しにするには?
BOM は TEncoding のインスタンスメソッド GetPreamble が返します。これが長さ 0 の
TBytes を返すと BOM 無しになります。
TEncoding.GetEncoding が返すインスタンスのクラスは TMBCSEncoding で、例えば
TEncoding.GetEncoding(65001) は TUTF8Encoding を返すわけではありません。
TMBCSEncoding は BOM 無しなので、TEncoding.GetEncoding(65001) 又は
TMBCSEncoding.Create(65001) は BOM 無しの UTF-8 のエンコーディングを返します。
これを使えば BOM無しの UTF-8の書き込みが可能になります。
#試してませんが、TEncoding.GetEncoding(1200) は BOM無し UTF-16
#TEncoding.GetEncoding(1200) は BOM無し BE UTF-16 になると思います。
----------
東京都 日野市 中村拓男