刚试用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.   

    function ISOToStr(ISOStr: string): string;//中文转换
    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;&#27874;&#20848;&#20057;&#32452;等转换
      

  2.   

    给楼主两个建议,一个方法。建议:
    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部分看看有没有指定编码,若无则一般按照系统默认编码处理。
      

  3.   

    谢谢楼上建议。确实没有很系统的学习过,零星地找网上的资料看了些。
      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貌似并没有起到转换作用。
      

  4.   

    在英文系统下当然乱码了,除非把英文系统的非unciode程序使用的字符集改成简体中文。
      

  5.   

    var
      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
      

  6.   

    你没理解我的意思,英文系统下添加语言支持后是可以正常显示中文的,前提是那个中文必须是unicode编码,如果是gb编码的话就乱码。我目前碰到的问题就是用idhttp获取的网页编码有不同,utf-8编码下由于delphi2009的string直接是unicode的,所以htm的源文件直接赋值给一个string就可以了(在中英文os下都能正常显示),而碰到gb编码的网页,得先取到stream里,然后该怎么对gb编码得stream转换成unicode我找不到方法,按网上找到的说法,LoadFromStream(stream,TEncoding.utf8)也不行。
      

  7.   

    我没理解错的话,你这段程序是把获得的网页转成ansi?而我想要的是ansi怎么转unicode。另外,我实际试了一下,如果网页是utf-8编码的话,你这个程序处理了以后仍然显示是乱码。
      

  8.   

    简单来说,我现在想求的答案是:1、idhttp是否有属性可以获取网页charset值?2、delphi2009下怎样把ansi编码的stream转换成unicode?
    求高人一解。实在不行我只好去啃delphi2009那个e文去了。