我试图在utf-8中发布请求,但是服务器在Ascii中获取它。
尝试了帖子的TstringList格式。
尝试了流格式
尝试强制TStringStream进行UTF8编码。
尝试将indy更新为xe5 indy
以下是一个示例代码:
var
server:TIdHttp;
Parameters,response:TStringStream;
begin
response := TStringStream.Create;
Parameters := TStringSTream.create(UTF8String('param1=Value1¶m2=عربي/عرب¶m3=Value3'),TEncoding.UTF8);
Server.Post(TIdURI.URLEncode('http://www.example.com/page.php'),Parameters,response);
end;
现在阿拉伯语编码在网络嗅探器中作为Ascii传递。
0060 d8 b9 d8 b1 d8 a8 d9 8a 2f d8 b9 d8 b1 d8 a8 26 ........ /......&
如何强制Indy Http id在Utf-8中传递请求参数而不在Ascii中传递?
答案 0 :(得分:14)
TStringStream
使用UnicodeString
并且TEncoding
- 知道所以请勿手动创建UTF8String
:
var
server: TIdHttp;
Parameters,response: TStringStream;
begin
response := TStringStream.Create;
Parameters := TStringStream.Create('param1=Value1¶m2=عربي/عرب¶m3=Value3', TEncoding.UTF8);
Server.Post('http://www.example.com/page.php',Parameters,response);
end;
或者,TStrings
版本默认也编码为UTF-8:
var
server: TIdHttp;
Parameters: TStringList;
Response: TStringStream;
begin
response := TStringStream.Create;
Parameters := TStringList.Create;
Parameters.Add('param1=Value1');
Parameters.Add('param2=عربي/عرب');
Parameters.Add('param3=Value3');
Server.Post('http://www.example.com/page.php',Parameters,response);
end;
无论哪种方式,您都应该在调用Post()
之前设置请求字符集,以便服务器知道您正在发送UTF-8编码数据:
Server.Request.ContentType := 'application/x-www-form-urlencoded';
Server.Request.Charset := 'utf-8';