Delphi 2009 の文字列 コードページ - Delphi 2009

Delphi2009では AnsiStringにコードページが設定できるようになったとのことです。さっそく試してみます。
まず、フォームに下図のとおりコンポーネントを配置します。~

次にこのページ末のコードを記述します。
プログラムを実行し、ボタンを押します。下図の結果を得られます。~


delphi2009では、AnsiStringにコードページを割り当てられます。
UTF7String = type AnsiString(65000); // UTF7
と定義すると、UTF7のAnsiString文字列となります。
コードページの変換は代入時に自動的に行われます。
input:string;
utf7:UTF7String;
と定義した文字列に対し
utf7:=input;
を実行すると、utf7にはUTF7形式に変換された文字が代入されます。

上記プログラムはコードページを変えた文字列を用意し、string型の文字列を代入し、そのAnsiStringの文字列から1文字づつ取り出し、16進数形式で表示するプログラムです。
それぞれのコードページごとに違ったバイト列になっていることが確認できます。

UTF16,UTF32のコードページについては、何も表示されていませんが、下記のMicrosoftのコードページ一覧表によると、UTF16,UTF32のコードぺージは managedコードの場合のみに有効のようです。

ソースコード

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  SJISString = type AnsiString(932);   // SJIS
  EUCString = type AnsiString(20932);  // EUC
  JISString = type AnsiString(50220);  // JIS ISO-2022JP
  UTF7String = type AnsiString(65000); // UTF7
  UTF8String = type AnsiString(65001); // UTF8
  UTF16LString = type AnsiString(1200);
    //Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications
  UTF16BString = type AnsiString(1201);
    //unicodeFFFE Unicode UTF-16, big endian byte order; available only to managed applications
  UTF32LString = type AnsiString(12000);
    //Unicode UTF-32, little endian byte order; available only to managed applications
  UTF32BString = type AnsiString(12001);
    //Unicode UTF-32, big endian byte order; available only to managed applications
  MACString = type AnsiString(10001);


  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  sjis:SJISString;
  euc:EUCString;
  jis:JISString;
  utf7:UTF7String;
  utf8:UTF8String;
  utf16l:UTF16LString;
  utf16b:UTF16BString;
  utf32l:UTF32LString;
  utf32b:UTF32BString;
  mac:MACString;

  i:integer;
  outs:String;
  input:string;
begin
  input := ''Delphi 2009 ではコード変換もらくらく???''+Chr($000D)+Chr($000A)+''po!'';

  sjis:=input;
  euc:=input;
  jis:=input;
  utf7:=input;
  utf8:=input;
  utf16l:=input;
  utf16b:=input;
  utf32l:=input;
  utf32b:=input;
  mac:=input;


  outs:=''sjis:'';
  for i:=0 to Length(sjis)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(sjis[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');

  outs:=''euc:'';
  for i:=0 to Length(euc)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(euc[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');

  outs:=''jis:'';
  for i:=0 to Length(jis)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(jis[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');

  outs:=''utf7:'';
  for i:=0 to Length(utf7)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(utf7[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');

  outs:=''utf8:'';
  for i:=0 to Length(utf8)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(utf8[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');


  outs:=''utf16L:'';
  for i:=0 to Length(utf16l)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(utf16l[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');


  outs:=''utf16B:'';
  for i:=0 to Length(utf16b)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(utf16b[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');


  outs:=''utf32L:'';
  for i:=0 to Length(utf32l)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(utf32l[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');

  outs:=''utf32B:'';
  for i:=0 to Length(utf32b)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(utf32b[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');

  outs:=''mac:'';
  for i:=0 to Length(mac)-1 do begin
    outs:=outs+'' ''+IntToHex(ord(mac[i]),2);
  end;
  Memo1.Lines.Add(outs);
  Memo1.Lines.Add('''');

  Memo1.Lines.Add(Input)
  //outs:=jis;
  //SetCodePage(outs,0);
  //ShowMessage(outs);
end;

end.
コードページ一覧 MSDNCode Page Identifiersより



著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2008-09-20
iPentec all rights reserverd.