[Delphi:90731] Delhi2009でのStringの配列

255 views
Skip to first unread message

Hosoi

unread,
Sep 28, 2008, 2:33:41 AM9/28/08
to Del...@ml.users.gr.jp
細井というものです。

Delphi2009にて下記のコードでDelphi2007(又はそれ以前)と挙動が違って困っ
ています。

procedure TForm1.Button1Click(Sender: TObject);
var
b1,b2,b3,b4:byte;
S:String;
Sl:TStringList;
begin
Sl:=TStringList.Create;
Sl.LoadFromFile('c:\test.txt');
S:=Sl.Text;
b1:=byte(S[1]);
b2:=byte(S[2]);
b3:=byte(S[3]);
b4:=byte(S[4]);
ShowMessage(IntToStr(b1)+':'+IntToStr(b2)+':'+IntToStr(b3)+':'+IntToStr(b4));
Sl.Free;
end;

c:\test.txtにはEUCで「さん」と書かれています。

Delphi2007の結果
164:181:164:243

Delphi2009の結果
100:117:100:251

本来は「さん」のバイナリは
A4 B5 A4 F3
なのでDelphi2007が正しいことになります。

Unicode化によりものだとは思いますが解決できません。

以上ですがよろしくお願いします。

P.S.
Delphi2009になって今までのコンポーネントが軒並み違う結果になってしまうの
で泣いています(泣

--
Hosoi


nekomaho

unread,
Sep 28, 2008, 5:03:56 AM9/28/08
to Del...@ml.users.gr.jp
c-yan です

TStrings.LoadFromFile でエンコードを指定していないので
デフォルトの CP932 で UTF8String に変換されてしまっているのでしょう.

type
EUCJString = type AnsiString(20932);

procedure TForm1.Button1Click(Sender: TObject);
var
B: TBytes;
S: EUCJString;
EUCEncoding: TEncoding;
begin
EUCEncoding := TEncoding.GetEncoding(20932);
with TStringList.Create do
try
LoadFromFile('c:\test.txt', EucEncoding);
S := EUCJString(Text);
finally
Free;
EUCEncoding.Free;
end;

B := BytesOf(S);
ShowMessage(Format('%d:%d:%d:%d', [B[0], B[1], B[2], B[3]]));
end;

以上です.

# 今回は EUC-JP と分かっているからいいものの・・・

Hosoi

unread,
Sep 28, 2008, 11:05:26 AM9/28/08
to Del...@ml.users.gr.jp
細井です。

お返事ありがとうございます。

しかし、結果からすると解決していません。
私が説明を端折ったのが悪いのですが、本当は
1、IdHTTPでEUCページをGet
2、1でGetしたデータをPzConvと言うコンポーネントでS-JISに変換
3、TStringListで解析
をやっていましてPzConv内でさきほどのよぅな内容で違う値が帰ってきた為に
S-JISに変換できなくて困っています。
なのでLoadStringでファイルを読んでいるのはデバッグの為に行っているのでそ
こを変えることは解決になりません。

以上ですがよろしくお願いします。

nekomaho

unread,
Sep 28, 2008, 11:37:31 AM9/28/08
to Del...@ml.users.gr.jp
c-yan です.

PzConv は Delphi 2009 に対応しているのですか?
対応していない気がしますが.

自分でやる気がないなら Delphi 2007 に止まって、
コンポーネント類が対応するまで待っていれば良いとおもいます.

以上です.

# EUC-JP である前提であれば、もはや PzConv は要らない気がするなあ・・・
# SetCodePage とか、TEncoding.Convert, TEncoding.GetString 辺りで方が付くはず・・・

Hosoi

unread,
Sep 29, 2008, 8:53:23 AM9/29/08
to Del...@ml.users.gr.jp
細井です。

On Mon, 29 Sep 2008 00:37:31 +0900
nekomaho <neko...@gmail.com> wrote:
|# EUC-JP である前提であれば、もはや PzConv は要らない気がするなあ・・・
|# SetCodePage とか、TEncoding.Convert, TEncoding.GetString 辺りで方が付くはず・・・

TEncode.ConvertでEUC->SJIS変換が出来るのでしょうか?

ちょっと使ってみたのですが、ヘルプを見ても要領を得なくて解りませんでした。

Hosoi

unread,
Sep 29, 2008, 9:51:05 AM9/29/08
to Del...@ml.users.gr.jp
細井です。

失礼しました。

書きかけで送信してしまいました。

もう少し自分で頑張ってみます。

もし出来ましたらどなたかサンプルコードをご教授いただけたら幸いです。

以上ですがよろしくお願いします。

nekomaho

unread,
Sep 29, 2008, 10:27:07 AM9/29/08
to Del...@ml.users.gr.jp
細井さん

c-yan です.

20分くらいで出来ました.
IdHTTP 使うの初めてで、1024バイト以上のリソースは放置な
いい加減コードですが、これで分かりますかね?

type
EUCJString = type AnsiString(20932);

procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TStream;
Buffer: TBytes;
EUCEncoding: TEncoding;
I: Integer;
begin
Stream := TMemoryStream.Create;
IdHTTP1.Get('http://xxxxxx/test.txt', Stream);
Stream.Seek(0, soFromBeginning);
SetLength(Buffer, 1024);
I := Stream.Read(Buffer[0], 1024);
SetLength(Buffer, I);
EUCEncoding := TEncoding.GetEncoding(20932);
Memo1.Text := EUCEncoding.GetString(Buffer);
EUCEncoding.Free;
Stream.Free;
end;

Hosoi

unread,
Sep 29, 2008, 10:48:26 AM9/29/08
to Del...@ml.users.gr.jp
c-yanさん、細井です。
返信有り難うございました。

On Mon, 29 Sep 2008 23:27:07 +0900
nekomaho <neko...@gmail.com> wrote:
|細井さん
|
|c-yan です.
|
|20分くらいで出来ました.
|IdHTTP 使うの初めてで、1024バイト以上のリソースは放置な
|いい加減コードですが、これで分かりますかね?

十分です。

StreamでのTBytes(Buffer)の使い方がこんな感じに使えるのですね
void型は便利ですね。


今までのコードを結構書き換えなければ行けませんがやはりUnicode化により便
利になったと言うべきでしょうか
新しい言語(仕様含む)について行かなくては・・・

重ね重ね有り難うございます。

Reply all
Reply to author
Forward
0 new messages