[Delphi:90752] TStrings と BOM

407 views
Skip to first unread message

中村拓男

unread,
Sep 29, 2008, 4:36:37 AM9/29/08
to Del...@ml.users.gr.jp
ブレーン@中村です。

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 になると思います。

----------
東京都 日野市 中村拓男

Reply all
Reply to author
Forward
0 new messages