我是把百度新闻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);
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);
解决方案 »
- 怎么把PrinterSetupDialog对话框在调用Execute时,标题“打印设置”改为”页面设置”?
- delphi中的ADODataSet取得数据后可以断开连接吧?
- 怎么样做到让程序GET时判断转向问题
- 如何更好地打印表格?
- TWebBrowser 组件编程问题!!!
- 请问如何找出一个数组中的第二个大值的位置?
- 数据问题??一定给分呀??快呀??
- 求一条sql语句。。折腾了两天了
- 有关DBGrid的DrawColumncell和Drawdatacell事件问题。
- 如何实现将word的表格和文本存入数据库中?
- 关于摄像头图像采集的一些问题求援助!
- alphacontrols 皮肤,当最小化到托盘的时候,还原窗口后,只有一个窗口的皮肤有效,别的窗体效果全没了
如果xml是UTF-8的话,就没有问题(不转换);如果是GB2312,中文全部变为‘?’。
求解!