Ton*_*ony 0 delphi http-post character-encoding
我已将应用程序从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);
Run Code Online (Sandbox Code Playgroud)
在调用时params.AddFormField(),您将charset设置为'utf8',这不是有效的charset名称.'utf-8'相反,官方的字符集名称是:
params.AddFormField('TEST', 'Test ‘n’ Try', 'utf-8').ContentTransfer := '8bit';
Run Code Online (Sandbox Code Playgroud)
在编译Unicode时,使用Indy的内置8位编码器结束无效字符集,该编码器将Unicode代码页> U + 00FF编码为字节0x3F('?').您正在使用的引号字符‘和’,是码点U + 2018和U + 2019,分别.
您在D2007中没有遇到此问题的原因是因为TIdFormDataField.Charset在编译Ansi时,编码会忽略该属性.该TIdFormDataField.FieldValue属性是一个AnsiString,其原始字节按原样传输,因此您需要确保在将其添加到之前对其进行正确编码TIdMultipartFormDataStream,例如:
params.AddFormField('TEST', UTF8Encode('Test ‘n’ Try'), 'utf-8').ContentTransfer := '8bit';
Run Code Online (Sandbox Code Playgroud)
在旁注中,您不需要在发布时设置Request.ContentType或Request.Charset属性TIdMultipartFormDataStream(尤其是因为'text/plain'MIME帖子的内容类型无效).此版本Post()将为您设置这些属性:
Params := TIdMultipartFormDataStream.Create;
params.AddFormField(...);
IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1095 次 |
| 最近记录: |