首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阅读网页/ unicode

阅读网页/ unicode
EN

Stack Overflow用户
提问于 2009-12-04 22:20:54
回答 2查看 1.8K关注 0票数 2

我在Delphi2009 /2010中有这个函数

它返回垃圾,现在如果我将char,pchar类型更改为Ansichar,Pansichar,它将返回文本,但所有外来unicode文本都是垃圾。这让我抓狂,我已经尝试了两天了,我想我已经理解了这个unicode的废话,但我想我帮不上忙,谢谢菲利普·沃特尔

代码语言:javascript
复制
function GetInetFileAsString(const fileURL: string): string;
const
  C_BufferSize = 1024;
var
  sAppName: string;
  hSession,
    hURL: HInternet;

  Buffer: array[0..C_BufferSize] of Char;
  BufferLen: DWORD;

  strPageContent: string;
  strTemp: string;

begin
  Result := '';
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil,
    nil, 0);
  try
    hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      strPageContent := '';
      repeat
        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        SetString(strTemp, PChar(@buffer), BufferLen div SizeOf(Char));
        strPageContent := strPageContent + strTemp;
      until BufferLen = 0;
      Result := strPageContent;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end
end;
EN

回答 2

Stack Overflow用户

发布于 2009-12-05 08:04:14

从Delphi2009开始,StringUnicodeString的别名,用于保存UTF16数据。另一方面,HTML页面通常使用多字节Ansi编码(目前通常是UTF-8,但并不总是)。您当前的代码只有在HTML编码为UTF-16的情况下才能工作,这种情况非常少见。您不应该直接将原始的HTML字节读取到UnicodeString中。您需要首先将整个数据下载到TBytesRawByteStringTMemoryStream或您选择的其他合适的字节容器中,然后根据HTTP Type响应头中指定的字符集执行Ansi->Unicode转换。您可以使用Accept-charset请求头来告诉服务器您希望以哪种字符集发送数据,如果服务器不能使用该字符集,那么它应该发送406 Not Acceptable响应(尽管如果它选择忽略您的请求头,它仍然可能以不可接受的字符集发送成功的响应,因此您应该考虑到这一点)。

尝试如下所示:

代码语言:javascript
复制
function GetInetFileAsString(const fileURL: string): string;
const
  C_BufferSize = 1024;
var
  sAppName: string;
  hSession, hURL: HInternet;
  Buffer: array of Byte;
  BufferLen: DWORD;
  strHeader: String;
  strPageContent: TStringStream;
begin
  Result := '';
  SetLength(Buffer, C_BufferSize);
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    strHeader := 'Accept-Charset: utf-8'#13#10;
    hURL := InternetOpenURL(hSession, PChar(fileURL), PChar(strHeader), Length(strHeader), 0, 0);
    try
      strPageContent := TStringStream.Create('', TEncoding.UTF8);
      try
        repeat
          if not InternetReadFile(hURL, PByte(Buffer), Length(Buffer), BufferLen) then
            Exit;
          if BufferLen = 0 then
            Break;
          strPageContent.WriteBuffer(PByte(Buffer)^, BufferLen);
        until False;
        Result := strPageContent.DataString;
        // or, use HttpQueryInfo(HTTP_QUERY_CONTENT_TYPE) to get
        // the Content-Type header, parse out its "charset" attribute,
        // and convert strPageContent.Memory to UTF-16 accordingly...
      finally
        strPageContent.Free;
      end;
    finally
      InternetCloseHandle(hURL);
    end
  finally
    InternetCloseHandle(hSession);
  end;
end;
票数 4
EN

Stack Overflow用户

发布于 2009-12-04 22:22:51

我的第一个想法是将正确的AcceptEncoding/CharSet头添加到请求中:

例如:

接受字符集: ISO-8859-1,utf-8;q=0.7,*;q=0.7

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1847238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档