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.
コードページ一覧 MSDN
Code Page Identifiersより
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用