我在Delphi 2009/2010中有这个功能
它返回垃圾,现在如果我将char,pchar类型更改为Ansichar,Pansichar它返回文本但是所有外部unicode文本都是垃圾。它让我香蕉 我现在已经尝试了2天所有的东西 我以为我不知道这个unicode废话,但我想我没有 请帮忙 谢谢 Philippe Watel
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;
答案 0 :(得分:4)
从Delphi 2009开始,String
是UnicodeString
的别名,它包含UTF-16数据。另一方面,HTML页面通常使用多字节Ansi编码进行编码(现在通常是UTF-8,但并非总是如此)。您的当前代码仅在HTML编码为UTF-16时才有效,这种情况非常罕见。您不应该直接将原始HTML字节读入UnicodeString
。您需要先将整个数据下载到TBytes
,RawByteString
,TMemoryStream
或您选择的其他合适的字节容器中,然后再执行Ansi> Unicode转换在HTTP“Content-Type”响应头中指定的charset上。您可以使用Accept-charset
请求标头告诉服务器您希望将数据发送到哪个字符集,如果服务器无法使用该字符集,那么它应该发送406 Not Acceptable
响应(尽管它如果它选择忽略您的请求标题,可能仍会在不可接受的字符集中发送成功的响应,因此您应该考虑到这一点。
尝试这样的事情:
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;
答案 1 :(得分:0)
我的第一个想法是在请求中添加正确的AcceptEncoding / CharSet标头:
e.g:
Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7