4

我必须使用 delphi 将文件发送到 php 脚本。我最终选择使用 Wininet 函数,因为我必须通过 NTLM 身份验证代理。

当我发送文件时,我的内容请求的每个字符之间都有空字符(00):

POST /upload.php HTTP/1.1
User-Agent: MYUSERAGENT
Host: 127.0.0.1
Cookie: ELSSESSID=k6ood2su2fbgrh805vs74fvmk5
Pragma: no-cache
Content-Length: 5

T.E.S

这是我的德尔福代码:

pSession := InternetOpen('MYUSERAGENT', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
pConnection := InternetConnect(pSession, PChar('127.0.0.1'), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
pRequest := HTTPOpenRequest(pConnection, PChar('POST'), PChar('/upload.php'), 'HTTP/1.0', nil, nil, INTERNET_SERVICE_HTTP, 0);
HTTPSendRequest(pRequest, nil, 0, Pchar('TESTR'), Length('TESTR'));

对正在发生的事情有任何想法吗?

4

2 回答 2

7

您没有考虑到 Delphi 字符串从 Delphi 2009 开始切换到 UTF-16 编码的 Unicode。当您通过 时PChar('TESTR'),您实际上是在通过 a PWideChar,而不是PAnsiChar您期望的 a 。字符串的字符长度为 5 个字符,但字节长度为 10 个字节。 HTTPSendRequest()对字节而不是字符进行操作。因此,您确实发送了 5 个字节,其中每个第二个字节为空,因为这就是 ASCII 字符在 UTF-16 中编码的方式。

将最后一行改为:

var
  S: AnsiString;
...
S := 'TESTR';
HTTPSendRequest(pRequest, nil, 0, PAnsiChar(S), Length(S)); 

您不需要对您正在调用的其他函数执行此操作,因为它们确实将 Unicode 字符作为输入,因此没有不匹配。

于 2012-09-05T08:49:57.963 回答
2

您使用的是 Delphi 2009 或更高版本吗?如果是这样,那么您的字符串将是 unicode。尝试为您的 TESTR 字符串使用 ANSIstring 变量

于 2012-09-05T08:47:19.040 回答