Delphi,MSXML2.XMLHTTP,PHP和Win-1250字符集编码

时间:2012-06-11 13:38:33

标签: php xml delphi unicode non-ascii-characters

海!

我试图在Windows中创建一个Web服务。

客户端是Delphi 6,带有MSXML2.XMLHTTP调用,另一端是PHP。

首先我测试过:我可以收到匈牙利语XML吗?

PHP源代码是UTF-8编码文件(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);

这个包我在Delphi方面完全得到了,口音很好。

然后我尝试从xml注入数据(将xml发布到带重音符号的php)。

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';

好的,我收到了“msg”字段,但是我尝试转换它,每当我收到一些转换通知时,结果与我直接设置变量时的结果不一样......

调试是:

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

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

当我从MSXML2转换输入时,你看到变量中有两个洞。

我真的不明白这一点。

我无法从输入XML中获取相同的XML输出,就像直接在PHP代码中设置一样......

为什么?

感谢您的每一个帮助,想法,链接,文档,小例子!

DD

2 个答案:

答案 0 :(得分:0)

由于您没有包含Delphi源代码,我怀疑您是直接从字符串发布数据作为请求的内容主体,默认情况下在Delphi 6中以当前ANSI编码进行编码。我建议您使用{在将此字符串作为请求的正文数据添加之前,在字符串上添加{1}},或者添加一个带有ANSI编码名称的“内容编码”请求标头(如果我没记错GetLocaleInfo可以给你这个)。

答案 1 :(得分:0)

问题的根源是Delphi代码。

之前我使用AnsiToUTF8编码XML文本。 但我认为COM对象使用的是UTF16。

工作代码是:

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;

这可以重新发送我发送的XML - 带有很好的重音。

感谢您的帮助:   DD