2012-09-05 5 views
4

나는 파일을 delphi로 PHP 스크립트에 보내야합니다. NTLM 인증 프록시를 통과해야하므로 최종적으로 Wininet 기능을 사용하기로 선택했습니다. 내가 파일을 보낼 때HTTPSendRequest로 업로드

, 나는 내 콘텐츠 요청의 각 문자 사이의 빈 문자 (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')); 

어떤 아이디어 ?

답변

7

당신은 델파이 문자열은 PChar('TESTR')을 통과 할 때 유니 코드는 실제로 PWideChar 아닌 PAnsiChar처럼 전달하는, 델파이 2009 년부터 인코딩 UTF-16로 전환하는 것이 고려되지 않습니다 너는 기대하고있다. 문자열의 문자 길이은 5 문자이지만 바이트 길이는은 10 바이트입니다. HTTPSendRequest()은 문자가 아닌 바이트로 작동합니다. 그래서 실제로 ASCII 문자가 UTF-16으로 인코딩 된 방법 때문에 각 두 번째 바이트가 null 인 5 바이트를 보내고 있습니다.

변경이 대신에 마지막 줄 : 당신은 그들이 입력으로 유니 코드 문자를 수행 할 수 있기 때문에 다른 기능이 호출되어 수행 할 필요가 없습니다, 그래서 불일치가없는

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

.

2

Delphi 2009 이상을 사용하고 있습니까? 그렇다면 문자열이 유니 코드에있게됩니다. 당신의 TESTR 문자열에 대한 AnsiString과 변수를 사용해보십시오