为什么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);
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);
...全文
相关推荐
gb2312和utf8相互转换
基于keil,单片机,实现gb2312和utf8编码的相互转换,实现web中文下发后台的封装转换。
STM32 C 语言转换 utf8 gb2312
STM32 C 语言转换 utf8 gb2312。附件是c源码
GB2312简体文字在线转换UTF8代码转换工具
GB2312简体文字在线转换UTF8代码转换工具
GB2312,UTF8,UCS2汉字编码生成与转换工具
GB2312,UTF8,UCS2汉字编码生成与转换
用Javascript实现UTF8编码转换成gb2312编码
代码如下://把编码转换成 gb2312编码 function UrlEncode(str) { var i, c, ret=””, strSpecial=”!\”#$%&'()*+,/:;<=>?@[\]^`{|}~%”; for(i = 0; i < str.length; i++) { //alert(str.charCodeAt(i)); c = str.charAt(i); if(c==” “) ret+=”+”; else if(strSpecial.indexOf(c)!=-1) ret += “%” + str.charCodeAt(i).toString


