为什么GB2312转换到UTF8,中文全部变为问号?
我是把百度新闻RSS从GB2312转换为UTF-8,重写了TNativeXml的LoadFromStream方法。
TMyNativeXml = class(TNativeXml)
public
procedure LoadFromStream(AStream: TStream;AEncoding: TEncoding); reintroduce;
end;
procedure TMyNativeXml.LoadFromStream(AStream: TStream;AEncoding: TEncoding);
var
LBuffer,LByteOrderMark: TBytes;
LOffset: Integer;
LEncoding,DestEncoding: TEncoding;
LMemStm: TMemoryStream;
begin
LEncoding:=nil;
if not Assigned(AEncoding) then
begin
inherited LoadFromStream(AStream);
Exit;
end
else
begin
DestEncoding:=AEncoding;
SetLength(LBuffer,AStream.Size);
AStream.ReadBuffer(LBuffer[0],Length(LBuffer));
LOffset:=TEncoding.GetBufferEncoding(LBuffer,LEncoding);
LBuffer:=TEncoding.Convert(LEncoding,DestEncoding,LBuffer,LOffset,Length(LBuffer)-LOffset);
LMemStm:=TMemoryStream.Create;
try
LByteOrderMark:=DestEncoding.GetPreamble; {获取编码识别符(BOM)}
LMemStm.Write(LByteOrderMark[0],Length(LByteOrderMark));
LMemStm.Write(LBuffer[0],Length(LBuffer));
LMemStm.Position:=0;
inherited LoadFromStream(LMemStm);
finally
FreeAndNil(LMemStm);
end;
SetLength(LBuffer,0);
SetLength(LByteOrderMark,0);
end;
end;
使用是:
var XmlParser:TMyNativeXml;
XmlParser:=TMyNativeXml.Create(Self);
XmlParser.LoadFromStream(TheStream,TEncoding.UTF8);