刚试用delphi2009,发现使用idhttp时,如果网页是utf-8编码,可以直接用get赋值给string即可,而如果是gb编码的的网页,需要先get读取到stream,直接用get赋值给string是乱码的。
程序1:网页是utf-8编码:
IdHTTP1.Head(edit1.text);
htmsrc:=IdHTTP1.Get(edit1.text);
memo1.Lines.Add(htmsrc);
程序2:网页是gb编码:
strm :=TMemoryStream.Create;
IdHTTP1.get(edit1.text,strm);
strm.Position:=0;
memo1.Lines.LoadFromStream(strm);
现在有2个问题:1)如何先取得head来判断网页的编码?IdHTTP1.Head(url);IdHTTP1.Response.ContentEncoding好像取不到charset值?
2)对于gb编码的网页,如何将stream编码成unicode?因为实际上程序2的memo1显示内容是gb编码的,只能在中文os下显示中文,在英文os下是乱码的。
程序1:网页是utf-8编码:
IdHTTP1.Head(edit1.text);
htmsrc:=IdHTTP1.Get(edit1.text);
memo1.Lines.Add(htmsrc);
程序2:网页是gb编码:
strm :=TMemoryStream.Create;
IdHTTP1.get(edit1.text,strm);
strm.Position:=0;
memo1.Lines.LoadFromStream(strm);
现在有2个问题:1)如何先取得head来判断网页的编码?IdHTTP1.Head(url);IdHTTP1.Response.ContentEncoding好像取不到charset值?
2)对于gb编码的网页,如何将stream编码成unicode?因为实际上程序2的memo1显示内容是gb编码的,只能在中文os下显示中文,在英文os下是乱码的。
解决方案 »
- 求businessskinform 控件的 TbsSkinButtonsBar组件两个问题
- 关于DBGridEH格式保存与调用
- intraweb 发布到IIS后,为何读取不到DLL路径的INI文件内容,注册表也读取不到,EXE是OK的!
- 怎么做一个透明的LISTVIEW组件。另外一个TPANEL的透明组件。当删除在它上面的动态按扭时并没有刷新
- 关于GPRS的问题,从来没做过,特来请教!
- 怎样去掉子form的ico啊!
- 急问题!向高手请教Rave报表问题:从Form传入一个字符串到报表!谢谢!
- 关于FastReport的几个简单问题......
- 仍然是数据库的查询问题(急!!!!!!!!!!!)
- 新手,创建一个DLL然后result返回值的问题
- 祝大家平安夜快乐,也庆祝自己技术分达到3位数了(有些寒碜,大家别喷我),散分100
- MEMO中截取英文输入法下的逗号字符
var
k: integer;
Codeint: integer;
Str: string;
Temp: string;
begin
Result := '';
Temp := ISOStr;
K := Pos('&#', Temp);
while k > 0 do
begin
K := Pos('&#', Temp);
if K <> 0 then
begin
Str := Copy(Temp, k + 2, 5);
Codeint := StrToInt(Str);
Result := Result + widechar(Codeint);//转换函数
Temp := Copy(Temp, K + 7, Length(Temp));
end;
end;
end;波兰乙组等转换
1. 看看字符编码(推荐:".Net与字符编码(理论篇)" http://baoquan.cnblogs.com/ )
2. 了解一下Delphi 2009的新特性(如TEncoding类)方法
1. Delphi2009里面,TStrings新增了LoadFrom重载方法:
TStrings.LoadFromStream (TStream, TEncoding);e.g.
memo1.Lines.LoadFromStream(strm, SysUtils.TEncoding.Default); // 使用当前系统默认的DBCS编码顺便说一下,一般先判断文件有没有BOM标识(如Unicode,UTF-8等),没有的话可视为ANSI文件。若为ANSI文件,可按照规则解析Head部分看看有没有指定编码,若无则一般按照系统默认编码处理。
stream :=TMemoryStream.Create;
IdHTTP1.get(edit1.Text,stream);
stream.Position := 0;
Memo1.Lines.LoadFromStream(stream,SysUtils.TEncoding.Default);
stream.Free;
这样写仍然不能正确显示utf-8编码的网页。其实我原先已经试过TEncoding.UTF8。现在现实就是:如果源是utf-8的,直接赋值到string就可以(在中英文系统下均正常显示中文,因为已经是unicode了),如果源是gb,那么一定要用stream,而且结果仍然是gb(在中文系统下正常,在英文系统下乱码)。SysUtils.TEncoding.Default也好TEncoding.UTF8貌似并没有起到转换作用。
url:string;
s:ansistring;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
try
IdHTTP.Get(url,ms); SetLength(s,ms.Size);
ms.Position:=0;
ms.Read(s[1],ms.Size);
//处理代码
end
求高人一解。实在不行我只好去啃delphi2009那个e文去了。