Delphi, MSXML2.XMLHTTP, PHP and Win-1250 charset encoding

Hoi!

I trying to make a webservice in Windows.

The client is Delphi 6, with MSXML2.XMLHTTP call, and other side is PHP.

First I tested: can I receive hungarian XML?

The PHP source was UTF-8 encoded file (PSPAD).

$s = 'alma árvíztűrő tükörfúrógép beta';
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
$m = $doc->createElement('package');
$doc->appendChild($m);
$n = $doc->createElement('Msg');
$m->appendChild($n);
$n->nodeValue = $s;
$xs = $doc->saveXML();
header('Content-Type: text/xml');
echo($xs);

This package I fully got in Delphi side, the accents are ok.

So then I tried to inject data from xml (post xml to php with accents).

global $HTTP_RAW_POST_DATA;
$xmlstr = $HTTP_RAW_POST_DATA;
$xml = new SimpleXMLElement($xmlstr);
$msg = $xml->msg;
#$msg = 'ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP';

Ok, I got the "msg" field, but nevertheless I trying to convert it, everytime I got some convert notice, and the result is not same as when I set the variable directly...

The debug is:

echo(utfCharToNumber($sinput).'<br>');
echo(utfCharToNumber($sdefined).'<br>');

Input:   195[   ]8286195141908419717682197[   ]328419
Defined: 195[129]8286195141908419717682197[144]328419
Input:   5156751951508270195154821951477119513780<br>
Defined: 5156751951508270195154821951477119513780<br>

As you see that two holes I have in the variable when I converted the input from MSXML2.

I really don't understand this.

I cannot reproduce same XML output from get the data from input XML as when I set directly in PHP code...

Why?

Thanks for your every help, idea, link, document, little example!

dd

Answers


Since you haven't included Delphi source, I suspect you're posting data straight from a string as content body of the request, which is encoded in the current ANSI encoding by default in Delphi 6. I advise you either use Utf8Encode on the string before you add this as the request's body data, or add a 'Content-encoding' request header with the name of the ANSI encoding (if I remember correctly GetLocaleInfo could give you this).


The source of the problem was the Delphi code.

Priorly I used AnsiToUTF8 to encode the XML text. But the COM object is uses UTF16 as I think.

The working code is this:

procedure TForm1.Button4Click(Sender: TObject);
var
    mhttp : variant;
    ws : WideString;
    tosend : OleVariant;
    xml : TXMLDocument;
    n : IXMLNode;
begin
    mhttp := CreateOleObject('MSXML2.XMLHTTP');
    mhttp.Open('POST', 'http://127.0.0.1/test_xmlgen.php', False);

    xml := CreateANewDocument(Self, '', 'a');
    n := xml.DocumentElement.AddChild('msg');
    n.NodeValue := 'ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP';
    xml.SaveToXML(ws);
    tosend := ws;

    mhttp.send(tosend);
    Memo1.Lines.Text :=
        IntToStr(mhttp.Status) + #13 +
        mhttp.responseText + #13;
end;

This can resend the XML I sent - with good accents.

Thanks for your help: dd


Need Your Help

HTTP PUT method returns 404 on IIS7

asp.net http file-upload activex

I installed demo activeX on my web application which at the end try to upload file on server using PUT method. I'm using Windows 7.

Binding list indices with modulus, want to make a circular list

python python-3.3 modulus

I'm currently working on a text based adventure game. It's my final assignment for a programming course and I got the tip from one of the instructors to use modulus to decrease the amount of code to