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
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 と分かっているからいいものの・・・
お返事ありがとうございます。
しかし、結果からすると解決していません。
私が説明を端折ったのが悪いのですが、本当は
1、IdHTTPでEUCページをGet
2、1でGetしたデータをPzConvと言うコンポーネントでS-JISに変換
3、TStringListで解析
をやっていましてPzConv内でさきほどのよぅな内容で違う値が帰ってきた為に
S-JISに変換できなくて困っています。
なのでLoadStringでファイルを読んでいるのはデバッグの為に行っているのでそ
こを変えることは解決になりません。
以上ですがよろしくお願いします。
PzConv は Delphi 2009 に対応しているのですか?
対応していない気がしますが.
自分でやる気がないなら Delphi 2007 に止まって、
コンポーネント類が対応するまで待っていれば良いとおもいます.
以上です.
# EUC-JP である前提であれば、もはや PzConv は要らない気がするなあ・・・
# SetCodePage とか、TEncoding.Convert, TEncoding.GetString 辺りで方が付くはず・・・
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変換が出来るのでしょうか?
ちょっと使ってみたのですが、ヘルプを見ても要領を得なくて解りませんでした。
失礼しました。
書きかけで送信してしまいました。
もう少し自分で頑張ってみます。
もし出来ましたらどなたかサンプルコードをご教授いただけたら幸いです。
以上ですがよろしくお願いします。
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;
On Mon, 29 Sep 2008 23:27:07 +0900
nekomaho <neko...@gmail.com> wrote:
|細井さん
|
|c-yan です.
|
|20分くらいで出来ました.
|IdHTTP 使うの初めてで、1024バイト以上のリソースは放置な
|いい加減コードですが、これで分かりますかね?
十分です。
StreamでのTBytes(Buffer)の使い方がこんな感じに使えるのですね
void型は便利ですね。
今までのコードを結構書き換えなければ行けませんがやはりUnicode化により便
利になったと言うべきでしょうか
新しい言語(仕様含む)について行かなくては・・・
重ね重ね有り難うございます。