为什么GB2312转换到UTF8,中文全部变为问号?

mingyu92 mingyu92 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我是把百度新闻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);
...全文
评论 2
收藏 已收藏
分享
返回顶部
mingyu92
Delphi 5,944 成员 262,941 内容