Delphi Programming / Object Pascal Delphi 一般・その他  
           
        
        
        
          
            
               テキスト保存 / 開くダイアログのエンコード設定 
             
            
               動作確認等  
               Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32 
             
           
        
        
        
          
            
              TSaveTextFileDialog / TOpenTextFileDialog のエンコード設定 
             
           
        
        
          
            
               TSaveTextFileDialog / TOpenTextFileDialog を使用して,テキストをファイルに保存する時と,ファイルからテキストを読み込む時のエンコードの設定方法のサンプルです.
 
           
        
        
          
            
              01_ EncodingIndex プロパティと Encodings プロパティ 
           
        
        
          
            
               TSaveTextFileDialog / TOpenTextFileDialog ダイアログには,[エンコーディング] の項目かあり,デフォルトで下図のような文字列がセットされています.
 
           
        
        
          
            
              図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 のポインタを取得できます.
 
           
        
        
          
            
              図2 
                  TMemo にテキストを表示 
                  これを保存して [開く] で読み込む 
                  
           
        
        
          
            
               このサンプルでは,ダイアログの下部の [エンコーディング] は下図のようになります.
 
           
        
        
          
            
              図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 が動作する環境では,ほとんどの場合リトルエンディアンと思われますが,コードページを指定して,強制的にリトルエンディアン,またはビッグエンディアンにすることもできます. 
 
           
        
        
              //  Unicoede リトルエンディアンLEncodings.AddObject('Unicode (Little endian)' , TEncoding.GetEncoding(1200 )); 
    //  Unicoede ビッグエンディアンLEncodings.AddObject('Unicode (Big endian)' , TEncoding.GetEncoding(1201 ));  
         
        
          
            
               BOM 付き (BOM あり) と BOM なしにはコードページの区別はありません.EncodingIndex プロパティなどをを使用して,個別に処理する必要があります.