トップへ(mam-mam.net/)

Quoted-printableとBase64エンコード,デコードと文字コード変換 ~Delphiでお手軽プログラミング

検索:

Quoted-printableとBase64エンコード,デコードと文字コード変換 ~Delphiでお手軽プログラミング

DelphiでQuoted-printableおよびBase64エンコード、デコードを行います。
また以下文字コードも指定できるようにします。
UTF-16LE(CP1200)、UTF-8、Shift-JIS、iso-2022-jp(JIS)、EUC-JP

画面設計

Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックします。
フォームにTMemo×2個、TButton×1個、TRadioGroup×3個をドラッグ&ドロップします。

ソースコードの記述

フォーム(Form1)の何もないところをダブルクリックして、以下のソースコードを記述します。
またButton1をダブルクリックして以下ソースコードを記述します。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    RadioGroup1: TRadioGroup;
    RadioGroup2: TRadioGroup;
    RadioGroup3: TRadioGroup;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;
  //コードーページ       UTF-16LE  UTF-8, SJIS JIS    EUC-JP
  cp:Array[0..4] of Integer=(1200, 65001, 932, 50220, 20932);

implementation

{$R *.dfm}

uses System.NetEncoding, //TNetEncoding.Base64
     IdCoderQuotedPrintable,IdGlobal;//Quoted-Printable

procedure TForm1.Button1Click(Sender: TObject);
var DecoderQp: TIdDecoderQuotedPrintable;
    EncoderQp: TIdEncoderQuotedPrintable;
    ibt:TIdBytes;
    enc:TEncoding;
    bt:TBytes;
    st:String;
begin
  //文字エンコード
  enc:=TEncoding.GetEncoding(cp[RadioGroup3.ItemIndex]);
  try
    if RadioGroup1.ItemIndex=0 then
    begin
      //デコード
      if RadioGroup2.ItemIndex=0 then //MIME(Base64)
      begin
        bt:=TNetEncoding.Base64.DecodeStringToBytes(Memo1.Lines.Text);
        st:=enc.GetString(bt);
      end
      else if RadioGroup2.ItemIndex=1 then //Quoted-Printable
      begin
        DecoderQp:=TIdDecoderQuotedPrintable.Create();
        try
          ibt:=DecoderQp.DecodeBytes(Memo1.Lines.Text);
          st:=enc.GetString(ibt);
        finally
          DecoderQp.Free;
        end;
      end;
    end
    else
    begin
      //エンコード
      if RadioGroup2.ItemIndex=0 then //MIME(Base64)
      begin
        bt:=enc.GetBytes(Memo1.Lines.Text);
        st:=TNetEncoding.Base64.EncodeBytesToString(bt);
      end
      else if RadioGroup2.ItemIndex=1 then //Quoted-Printable
      begin
        EncoderQp:=TIdEncoderQuotedPrintable.Create();
        try
          ibt:=TIdBytes(enc.GetBytes(Memo1.Lines.Text));
          st:=EncoderQp.EncodeBytes(ibt);
        finally
          EncoderQp.Free;
        end;
      end;
    end;
  finally
    enc.Free;
  end;
  Memo2.Lines.Text:=st;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RadioGroup1.Caption:='デコードかエンコード';
  RadioGroup1.Items.Add('デコード');
  RadioGroup1.Items.Add('エンコード');
  RadioGroup1.ItemIndex:=1;

  RadioGroup2.Caption:='変換方式';
  RadioGroup2.Items.Add('MIME(Base64)');
  RadioGroup2.Items.Add('Quoted-Printable');
  RadioGroup2.ItemIndex:=0;

  RadioGroup3.Caption:='文字コード';
  RadioGroup3.Items.Add('UTF-16LE');
  RadioGroup3.Items.Add('UTF-8');
  RadioGroup3.Items.Add('Shift-JIS');
  RadioGroup3.Items.Add('ISO-2022-JP(JIS)');
  RadioGroup3.Items.Add('EUC-JP');
  RadioGroup3.ItemIndex:=1;
end;

end.

実行する

Memo1に任意の文字列を入れて「エンコード」「Quoted-Printable」「ISO-2022-JP」を選択して「Button1」ボタンを押すとMemo2にエンコードされた文字列が表示されます。

Memo1にエンコードされた文字列を入れて「デコード」を選択して「Button1」ボタンを押すとMemo2にデコードされた文字列が表示されます。