[Delphi] BOM無しUTF-8で保存


※全てのDelphiで動作する保証はありません。また、内容に関し管理人は全ての責任を負いかねます

サンプル ※説明に必要な部分しか記述していません。


「TEncoding.UTF8」を使って保存し

out_list.SaveToFile(‘任意のファイル名’, TEncoding.UTF8);

そのファイルをメモ帳で確認すると「UTF-8(BOM 付き)」として保存されています。

 

そこで、BOMなしの方が必要な場合に、「BOMなしUTF-8」として保存する方法です。なお、このコードは関係する部分のみです。なお、ポイントは SaveToFile のエンコード部分です。


        in_list := TStringList.Create;
        out_list := TStringList.Create;
        Enc := TEncoding.GetEncoding(CP_UTF8);
      try

        //ANSIで読み込む
        in_list.LoadFromFile('任意のファイル');
        //元々のファイルが UTF-8 の場合はこちら↓。UTF-8で読み込む
//      in_list.LoadFromFile('任意のファイル', Enc);

        out_list.Text := in_list.Text;

        //UTF-8で保存する
        out_list.SaveToFile('任意のファイル名', Enc);

      finally
        Enc.Free;
        out_list.Free;
        in_list.Free;
      end;

同様にメモ帳で確認すると、「UTF-8」(BOMなし)として保存されていました。

 

ちなみに、Windowsユニットで

CP_UTF8 = 65001;

と定義されています。

そして、このコードは下記のサイトを参考にさせて頂きました(謝辞)。

 

参考サイト

■Delphi 2009 とUnicode : Part II

・Delphi 2009 でのUnicode の扱い方と基本的な Unicode の構造について解説します。

https://edn.embarcadero.com/jp/article/38783

 

GetEncodingを使えば、”任意のANSIコードページ” でファイルの入出力が可能となります。

また、TEncoding.UTF8 ではなく、GetEncoding(65001) を利用すれば、BOM 無し UTF-8(UTF-8N) を入出力する事が可能です。但し、GetEncoding()を利用する場合には、サンプルコードのように Free を使ってオブジェクトを破棄する必要があります。

procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
  Enc: TEncoding;
begin
  SL := TStringList.Create;
  Enc := TEncoding.GetEncoding(20932); // EUC-JP(CP20932)
  try
    SL.Add('Tiburón');
    // File Save
    SL.SaveToFile('C:\Ansi.txt', Enc);
  finally
    Enc.Free;
    SL.Free;
  end;
end;

 




トップページへ