Delphi Programming / Object Pascal
[掲載 2023年01月03日] [更新 2023年01月04日] Delphi 一般・その他
テキスト保存 / 開くダイアログのエンコード設定
動作確認等
Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32
TSaveTextFileDialog / TOpenTextFileDialog のエンコード設定
TSaveTextFileDialog / TOpenTextFileDialog を使用して,テキストをファイルに保存する時と,ファイルからテキストを読み込む時のエンコードの設定方法のサンプルです.
01_ EncodingIndex プロパティと Encodings プロパティ
TSaveTextFileDialog / TOpenTextFileDialog ダイアログには,[エンコーディング] の項目かあり,デフォルトで下図のような文字列がセットされています.
下図は,TSaveTextFileDialog ダイアログの下部の部分です.
図1
[エンコーディング] の項目のインデックスは,EncodingIndex プロパティで設定,取得できます.項目の文字列は,Encodings プロパティで設定,取得できます.
これらの値を使用して,テキストを保存,または読み込む時のエンコードの設定ができます.
copy code
// =============================================================================
// TSaveTextFileDialog の EncodingIndex プロパティと Encodings プロパティ
// TOpenTextFileDialog も同じ
// =============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LEncIndex : Integer;
LEncText : string ;
begin
if SaveTextFileDialog1.Execute then begin
LEncIndex := SaveTextFileDialog1.EncodingIndex;
LEncText := SaveTextFileDialog1.Encodings[LEncIndex];
// エンコードのインデックスまたはエンコードの文字列に応じた処理
ShowMessage(LEncText);
end ;
end ;
02_ Encodings.Objects プロパティを使用する
Encodings プロパティは,TStrings 型のプロパティです.AddObjects メソッドで TEncoding を格納しておけば,ダイアログで選択した [エンコーディング] に相当する TEncoding のポインタを取得できます.
その TEndoding の値を,TMemo.Linse.SaveToFile メソッド,あるいは TMemo.Lines.LoadFromFile メソッドなどの引数に使用すると便利です.その例です.
図2
[テキスト] をクリックしてから [保存]
TMemo にテキストを表示
これを保存して [開く] で読み込む
このサンプルでは,ダイアログの下部の [エンコーディング] は下図のようになります.
これは,TSaveTextFileDialog の場合ですが,TOpenTextFileDialog でも同じです.[保存] が [開く] になるだけです.
図3
LEncodings.AddObject の Shift_JIS の部分は,以下でも同じです.日本語 Windows の環境では,Ansi の指定は,自動的に Shift_JIS になります.
LEncodings.AddObject('Ansi' , TEncoding.ANSI);
copy code
// =============================================================================
// 保存するテキストを Memo1 ( TMemo ) に表示
// =============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
// 文字列をセット
Memo1.Lines.Add(#$4F60 #$597D + ' !!' );
Memo1.Lines.Add(#$D842 #$DFB7 + ' (サロゲートペアな文字)' );
Memo1.Lines.Add('テキストの保存と読み出し' );
end ;
// =============================================================================
// テキストの保存
// TSaveTextFileDialog におむるエンコードリストの作成
//
// この場合の Unicode は UTF-16
// この場合の UTF-8 は BOM 付き
// =============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LEncodings : TStringList;
LEncIndex : Integer;
LEncoding : TEncoding;
begin
// エンコードオブジェクトの作成
LEncodings := TStringList.Create;
try
LEncodings.AddObject('Shift_JIS' , TEncoding.GetEncoding(932 ));
LEncodings.AddObject('Unicode' , TEncoding.Unicode);
LEncodings.AddObject('UTF-8' , TEncoding.UTF8);
SaveTextFileDialog1.Encodings.Assign(LEncodings);
finally
FreeAndNil(LEncodings);
end ;
SaveTextFileDialog1.Filter := 'テキストファイル (*.txt)|*.txt|)' ;
SaveTextFileDialog1.FileName := ExpandFileName('.\000.txt' );
SaveTextFileDialog1.EncodingIndex := 2 ;
if SaveTextFileDialog1.Execute then begin
// ダイアログで選択した TEncoding を取得
LEncIndex := SaveTextFileDialog1.EncodingIndex;
LEncoding := SaveTextFileDialog1.Encodings.Objects[LEncIndex] as TEncoding;
Memo1.Lines.SaveToFile(SaveTextFileDialog1.FileName, LEncoding);
end ;
end ;
// =============================================================================
// テキストの読み込み
// TOpenTextFileDialog におむるエンコードリストの作成
//
// この場合の Unicode は UTF-16
// この場合の UTF-8 は BOM 付き
// =============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
LEncodings : TStringList;
LEncIndex : Integer;
LEncoding : TEncoding;
begin
Memo1.Lines.Clear;
// エンコードオブジェクトのリストを作成
LEncodings := TStringList.Create;
try
LEncodings.AddObject('Shift_JIS' , TEncoding.GetEncoding(932 ));
LEncodings.AddObject('Unicode' , TEncoding.Unicode);
LEncodings.AddObject('UTF-8' , TEncoding.UTF8);
OpenTextFileDialog1.Encodings.Assign(LEncodings);
finally
FreeAndNil(LEncodings);
end ;
OpenTextFileDialog1.Filter := 'テキストファイル (*.txt)|*.txt|)' ;
OpenTextFileDialog1.FileName := ExpandFileName('.\000.txt' );
OpenTextFileDialog1.EncodingIndex := 2 ;
if OpenTextFileDialog1.Execute then begin
// ダイアログで選択した TEncoding を取得
LEncIndex := OpenTextFileDialog1.EncodingIndex;
LEncoding := OpenTextFileDialog1.Encodings.Objects[LEncIndex] as TEncoding;
Memo1.Lines.LoadFromFile(OpenTextFileDialog1.FileName, LEncoding);
end ;
end ;
Windows が動作する環境では,ほとんどの場合リトルエンディアンと思われますが,コードページを指定して,強制的にリトルエンディアン,またはビッグエンディアンにすることもできます.
単に Unicode と書いた場合は,リトルエンディアンを意味します.リトルエンディアンは,LE,ビッグエンディアンは BE と表記することもあります.
// Unicoede リトルエンディアン
LEncodings.AddObject('Unicode (Little endian)' , TEncoding.GetEncoding(1200 ));
// Unicoede ビッグエンディアン
LEncodings.AddObject('Unicode (Big endian)' , TEncoding.GetEncoding(1201 ));
BOM 付き (BOM あり) と BOM なしにはコードページの区別はありません.EncodingIndex プロパティなどをを使用して,個別に処理する必要があります.