Delphi tidhttp编码特殊字符

时间:2016-10-12 22:45:08

标签: delphi character-encoding http-post

我已将应用程序从D2007升级到XE6。它将数据发布到网络服务器。

我无法确定哪些编码会正确发送左右引号字符(下面的代码段)。我已经尝试了所有可以找到的选项,但是在发送时它们被编码为?(就我在WireShark中看到的那样)。

D2007没有问题,但XE6完全是关于Unicode的,我不确定问题是编码还是代码页或什么。

  Params := TIdMultipartFormDataStream.Create;
  params.AddFormField('TEST', 'Test ‘n’ Try', 'utf8').ContentTransfer := '8bit';
  IdHTTP1.Request.ContentType := 'text/plain';
  IdHTTP1.Request.Charset := 'utf-8';
  IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream);

1 个答案:

答案 0 :(得分:5)

调用_时,您将charset设置为params.AddFormField(),这不是有效的字符集名称。官方字符集名称为'utf8'

'utf-8'

编译Unicode时,使用Indy的内置8位编码器结束无效的字符集,该编码器对Unicode代码页进行编码> U + 00FF为字节0x3F(params.AddFormField('TEST', 'Test ‘n’ Try', 'utf-8').ContentTransfer := '8bit'; )。您使用的引号字符'?'分别是代码点U + 2018和U + 2019。

在D2007中没有遇到此问题的原因是因为编译Ansi时出于编码目的忽略属性。 TIdFormDataField.Charset属性是TIdFormDataField.FieldValue,其原始字节按原样传输,因此您需要确保在将其添加到AnsiString之前对其进行正确编码,例如:

TIdMultipartFormDataStream

在旁注中,发布params.AddFormField('TEST', UTF8Encode('Test ‘n’ Try'), 'utf-8').ContentTransfer := '8bit'; 时不需要设置Request.ContentTypeRequest.Charset属性(特别是因为TIdMultipartFormDataStream是无效的内容类型一个MIME帖子无论如何)。此版本的'text/plain'将为您设置这些属性:

Post()