当Indy HTTP服务器收到url请求时,如/ a?location =%D1%82%D0%B5%D1%81%D1%82(utf-8 url-encoded value),“location”字段位于requestinfo的Params具有不可读的值ÑÐμÑÑ。
如何获得可读的价值? Indy HTTPServer ver 10.6.0.4975
答案 0 :(得分:1)
TIdHTTPServer
当前使用Content-Type
请求标头中指定的字符集解析输入参数,如果没有指定字符集,则使用Indy的8位编码。这是TIdHTTPServer
的已知限制,因为目前没有选项告诉它使用用户定义的字符集解码参数。因此,您必须手动解析ARequestInfo.QueryParams
和/或ARequestInfo.UnparsedParams
属性,例如直接使用TIdURI.URLDecode()
参数中的UTF-8编码调用AByteEncoding
,例如:
procedure MyDecodeAndSetParams(ARequestInfo: TIdHTTPRequestInfo);
var
i, j : Integer;
value: s: string;
LEncoding: IIdTextEncoding;
begin
if IsHeaderMediaType(ARequestInfo.ContentType, 'application/x-www-form-urlencoded') then
begin
value := ARequestInfo.FormParams;
LEncoding := CharsetToEncoding(ARequestInfo.CharSet);
end else
begin
value := ARequestInfo.QueryParams;
LEncoding := IndyTextEncoding_UTF8;
end;
ARequestInfo.Params.BeginUpdate;
try
ARequestInfo.Params.Clear;
i := 1;
while i <= Length(value) do
begin
j := i;
while (j <= Length(value)) and (value[j] <> '&') do
begin
Inc(j);
end;
s := StringReplace(Copy(value, i, j-i), '+', ' ', [rfReplaceAll]);
ARequestInfo.Params.Add(TIdURI.URLDecode(s, LEncoding));
i := j + 1;
end;
finally
ARequestInfo.Params.EndUpdate;
end;
end;
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
MyDecodeAndSetParams(ARequestInfo);
...
end;