Unicode ファイルに対する TEncoding の使用
VCL への移動
Delphi と C++Builder では、2009 製品バージョンから、デフォルトの文字列型として Unicode を使用するようになりました。
以前の形式での読み取りと書き込み
多くの Delphi アプリケーションでは、他のアプリケーションやデータソースとのやり取りを続ける必要があり、それらの多くは ANSI 形式または ASCII 形式のデータしか処理できません。そのため、TStrings メソッドはデフォルトでは、(アクティブ コード ページに基づいて)ANSI エンコード ファイルに書き込み、ファイルにバイト オーダー マーク(BOM)が含まれているかどうかに基づいてファイルを読み取ります。
BOM が検出された場合は、TStrings メソッドは BOM で示されるエンコードでデータを読み取ります。BOM が検出されない場合、TStrings メソッドはデータを ANSI 形式で読み取り、現在のアクティブ コード ページに基づいて変換します。
RAD Studio 2009 より前のバージョンの Delphi で書き込まれたすべてのファイルも依然として読み取られます。ただし、読み取りと書き込みに同じアクティブ コード ページを使用する必要があります。同様に、RAD Studio 2009 で ASCII エンコーディングで書き込まれたファイルはどれも、RAD Studio 2009 より前のバージョンで読み取ることができます。
RAD Studio 2009 でそれ以外の任意のエンコーディングで書き込まれたファイルはどれも BOM を生成し、RAD Studio 2009 より前のバージョンでは読み取ることができません。現時点では、最も一般的な BOM 形式(UTF16 リトルエンディアン、UTF16 ビッグエンディアン、UTF8)のみ検出されます。
新しいエンコーディングの使用
Unicode 形式(リトルエンディアン UTF16、ビッグエンディアン UTF16、UTF8、UTF7 など)で TStrings クラスを使ってテキスト データを読み書きした方がよい場合があります。TEncoding クラスは、.NET Framework の System.Text.Encoding クラスとメソッドや機能がよく似ています。
var S: TStrings; begin S := TStringList.Create(); { ... } S.SaveToFile('config.txt', TEncoding.UTF8);
追加パラメータ TEncoding.UTF8 がなければ、'config.txt' は単に現在のアクティブ コードページに基づいて変換され、ANSI エンコードされたものとして書き出されることになります。TStrings の方で BOM に基づいてエンコーディングを自動的に検出しそれに応じて動作するので、読み取りコードを変更する必要はありません。
特定のコード ページを使って強制的にファイルを読み書きする場合は、TMBCSEncoding のインスタンスを作成し、使用するコード ページをコンストラクタに渡すことができます。その後で、そのインスタンスを使用してファイルを読み書きします。その特定のコード ページがユーザーのアクティブ コード ページと一致しないおそれがあるからです。
これらのクラスには同じことが当てはまります。つまり、データは ANSI データとして読み書きされるのです。従来 INI ファイルは常に ANSI(ASCII)でエンコードされてきたので、アプリケーションのニーズによっては、これらのファイルを変換することは意味がないかもしれません。Unicode 形式を使用する場合は、TEncoding クラスを使用してそれを実現する手段も提供されます。
上記の場合はすべて、データは内部的には Unicode で格納され、文字列についてのあらゆるデータ操作は、引き続き、期待どおりに機能します。データを読み書きするときに、変換が自動的に行われます。
ここに、コードページ識別子(MSDN)のリストを示します。
TEncoding パラメータを受け付けるオーバーロード メソッドのリストを以下に示します。
- WriteNode(Outline.TOutlineNode)
- LoadFromFile(Outline.TOutlineNode)
- LoadFromStream(Outline.TOutlineNode)
- SaveToFile(Outline.TOutlineNode)
- SaveToStream(Outline.TOutlineNode)
- LoadFromFile(Classes.TStrings)
- LoadFromStream(Classes.TStrings)
- SaveToFile(Classes.TStrings)
- SaveToStream(Classes.TStrings)
- Create(Classes.TStringStream)
- Create(Classes.TStreamReader)
- Create(Classes.TStreamWriter)