procedure GetStringFromStream(AStream: TMemoryStream);
var
charBuffer: PAnsiChar;
begin
SetLength(FResponseString, AStream.Size);
GetMem(charBuffer, AStream.Size);
Move(PAnsiChar(AStream.Memory)^, charBuffer^, AStream.Size);
FResponseString := PChar(charBuffer);
FreeMem(charBuffer);
end;
用上面的代码得到的是乱码,AStream中的数据中从一个网页上Get来的,网页的编码是gb2312。如果我这样操作AStream.SaveToFile,打开就是正确的代码。已经用16进制的软件打开过两种方式得到的字符了,编码也是不一样的,就是说上面的代码运作过程是经过了一个转换了。有高手知道怎么处理吗?在线急等了,谢谢各位先。
AStream.Read(charBuffer^, AStream.Size);
FResponseString := PChar(charBuffer);
FreeMem(charBuffer);这样子改了下,还是不行,但是这次取到的编码跟上面的不一样了,貌视还不是gb2312的编码。
看也没意义吧?Stream的操作貌视是基于Byte的,它当然是原样把全部Byte存入文件里完事了吧。但这个网页是gb2312的,我需要把这些流存入一个string中,这当中应该是有一个转换过程的,就是不知道怎么转换呢?
我觉得网页编码UTF-8更多吧,先用Utf8decode试试,再找找相关函数吧。
FResponseString := PAnsiChar(charBuffer);
不能用PChar转换,然后再用Utf8decode转换一下试试。
{ 将内存流转换成字符串 }
var
I: Integer;
begin
Result := '';
if not Assigned(mStream) then Exit;
SetLength(Result, mStream.Size);
for I := 0 to Pred(mStream.Size) do try
mStream.Position := I;
mStream.Read(Result[Succ(I)], 1);
except
Result := '';
end;
end; { StreamToString } 不知道這個對你有沒有用?
1. 把TMemoryStream.SaveToStream(TStringStream),然后通过TStringStream.DataString得到字符串2. CopyMemory(Buffer,TMemoryStream.Memory,fsize);这个应该得到的是原编码内容
CopyMemory、MOVE和Read(Buffer^,fsize)应该是相同的效果,可以先跟踪下看看Buffer的内容,看看从TMemoryStream到Buffer 再到字符串的变化
var
charBuffer: PAnsiChar;
begin
SetLength(FResponseString, AStream.Size);
GetMem(charBuffer, AStream.Size);
Move(PAnsiChar(AStream.Memory)^, charBuffer^, AStream.Size);
FResponseString := PAnsiChar(charBuffer);
FreeMem(charBuffer);
end;
我觉得是这样,Delphi7里面的PChar=PAnsiChar,Delphi2010里面的PChar=PWideChar