2012-06-11 13 views
1

Hoi!Delphi,MSXML2.XMLHTTP,PHP和Win-1250字符集編碼

我試圖在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); 

這個軟件包我完全在德爾福方面,口音都可以。

所以然後我試圖從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'; 

好吧,我得到了「味精」的領域,但無論如何,我試圖將其轉換,每次我得到了一些轉換通知,而結果是不一樣的,當我直接設置變量...

調試是:

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,當我直接設置在PHP代碼中的數據...

爲什麼XML輸出相同?

感謝您的每一個幫助,想法,鏈接,文件,小例子!

DD

回答

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

0

因爲我們還沒有包括Delphi源,我懷疑你是直接從一個字符串作爲請求,這是在當前ANSI編碼默認情況下,在Delphi 6編碼的內容主體發佈的數據。我建議你在將字符串作爲請求的正文數據添加之前使用Utf8Encode,或者在ANSI編碼的名稱(如果我沒記錯的話GetLocaleInfo可以給你這個)添加一個'Content-encoding'請求頭。