Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-tidhttp编码特殊字符_Delphi_Character Encoding_Http Post - Fatal编程技术网

Delphi-tidhttp编码特殊字符

Delphi-tidhttp编码特殊字符,delphi,character-encoding,http-post,Delphi,Character Encoding,Http Post,我已将一个应用程序从D2007升级到XE6。它将数据发布到Web服务器 我无法确定什么编码将正确发送左引号和右引号字符(下面的代码片段)。我已经尝试了我能找到的每一个选项,但它们在发送时被编码为?(据我在WireShark中所见) D2007没有问题,但是XE6是关于Unicode的,我不确定问题是编码还是代码页还是什么 Params := TIdMultipartFormDataStream.Create; params.AddFormField('TEST', 'Test ‘n’ T

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

我无法确定什么编码将正确发送左引号和右引号字符(下面的代码片段)。我已经尝试了我能找到的每一个选项,但它们在发送时被编码为
(据我在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);

调用
params.AddFormField()
时,将字符集设置为
'utf8'
,该字符集名称无效。官方字符集名称为“utf-8”:

params.AddFormField('TEST', 'Test ‘n’ Try', 'utf-8').ContentTransfer := '8bit';
为Unicode编译时,一个无效的字符集最终使用Indy的内置8位编码器,该编码器将Unicode codepages>U+00FF编码为字节0x3F(
“?”
)。您正在使用的引号字符,
,分别是代码点U+2018和U+2019

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

params.AddFormField('TEST', UTF8Encode('Test ‘n’ Try'), 'utf-8').ContentTransfer := '8bit';
另一方面,在发布
TIdMultipartFormDataStream
时,不需要设置
Request.ContentType
Request.Charset
属性(尤其是因为
'text/plain'
对于MIME帖子来说是无效的内容类型)。此版本的
Post()
将为您设置以下属性:

Params := TIdMultipartFormDataStream.Create;
params.AddFormField(...);
IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream);

调用
params.AddFormField()
时,将字符集设置为
'utf8'
,该字符集名称无效。官方字符集名称为“utf-8”:

params.AddFormField('TEST', 'Test ‘n’ Try', 'utf-8').ContentTransfer := '8bit';
为Unicode编译时,一个无效的字符集最终使用Indy的内置8位编码器,该编码器将Unicode codepages>U+00FF编码为字节0x3F(
“?”
)。您正在使用的引号字符,
,分别是代码点U+2018和U+2019

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

params.AddFormField('TEST', UTF8Encode('Test ‘n’ Try'), 'utf-8').ContentTransfer := '8bit';
另一方面,在发布
TIdMultipartFormDataStream
时,不需要设置
Request.ContentType
Request.Charset
属性(尤其是因为
'text/plain'
对于MIME帖子来说是无效的内容类型)。此版本的
Post()
将为您设置以下属性:

Params := TIdMultipartFormDataStream.Create;
params.AddFormField(...);
IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream);

Oops wireshark中的数据包现在包含00054 45 53 54 3d 54 65 73 74 2b 25 45 32 25 38 30测试=测试+%E2%80 0010 25 39 38 6e 25 45 32 25 38 30 39 39 2b 54 72%98n%E2%80%99+Tr 0020 79,但网站显示了上述内容。我认为Web服务器将我的数据保存为原始文本,然后使用utf-8编码显示。有没有办法像D2007那样发送原始ascii码。我找不到任何地方都可以尝试的所有编码选项:(
Test-n)™ Try
是UTF-8编码字节显示为拉丁文1时的样子。听起来Web服务器正确接收UTF-8字节,但没有将其解码为UTF-8。但此输出证明您的输入字符串被编码为UTF-8。Wireshark中看到的十六进制输出是以URL编码格式编码的UTF-8字节,这是
TIdMultipartFormDataStream
版本的
Post()
没有做的事情(
TStrings
版本有),因此,如果没有看到实际的Wireshark捕获,我无法解释为什么会出现这种情况。@StanE:如果您使用的是ANSI版本的Delphi,那么就没有捷径了。如果您使用的是Unicode版本的Delphi,则可以省略
UTF8Decode()
(将数据编码为字节时,
字符集将生效)。无论哪种方式,都需要
ContentTransfer
,否则数据将被编码为7bit ASCII,对于非ASCII字符,将中断UTF-8。以及
“UTF-8”
“UTF-8”
都是一样的,头是不区分大小写的。哦,wireshark中的数据包现在包含000544553543D 546573742B 254532253830测试=测试+%E2%800010 253938386E 254532253830253392B 5472%98n%E2%80%99+Tr 002079,但网站会显示上面的内容。我认为Web服务器会将我的数据保存为原始文本,然后再显示出来可能是utf-8编码。有没有办法像D2007那样发送原始ascii。我找不到所有的编码选项可以在任何地方尝试:(
Test–n€)™ Try
是UTF-8编码字节显示为拉丁文1时的样子。听起来Web服务器正确接收UTF-8字节,但没有将其解码为UTF-8。但此输出证明您的输入字符串被编码为UTF-8。Wireshark中看到的十六进制输出是以URL编码格式编码的UTF-8字节,这是
TIdMultipartFormDataStream
版本的
Post()
没有做的事情(
TStrings
版本有),因此,如果没有看到实际的Wireshark捕获,我无法解释为什么会出现这种情况。@StanE:如果您使用的是ANSI版本的Delphi,那么就没有捷径了。如果您使用的是Unicode版本的Delphi,则可以省略
UTF8Decode()
(将数据编码为字节时,
字符集将生效)。无论哪种方式,都需要
ContentTransfer
,否则数据将被编码为7bit ASCII,对于非ASCII字符将中断UTF-8。以及