海!
我试图在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
答案 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