我已将应用程序从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);
答案 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.ContentType
或Request.Charset
属性(特别是因为TIdMultipartFormDataStream
是无效的内容类型一个MIME帖子无论如何)。此版本的'text/plain'
将为您设置这些属性:
Post()