1

ホイ!

WindowsでWebサービスを作成しようとしています。

クライアントはDelphi6で、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からの入力を変換したときに、変数に2つの穴があります。

私は本当にこれを理解していません。

PHPコードで直接設定した場合と同じXML出力を入力XMLからデータを取得して再現することはできません...

なんで?

すべてのヘルプ、アイデア、リンク、ドキュメント、小さな例をありがとう!

dd

4

2 に答える 2

0

Delphiソースを含めていないため、リクエストのコンテンツ本文として文字列から直接データを投稿していると思われます。これは、Delphi6ではデフォルトで現在のANSIエンコーディングでエンコードされていますUtf8Encode。これをリクエストの本文データとして追加するか、ANSIエンコーディングの名前で「Content-encoding」リクエストヘッダーを追加します(私が正しく覚えていれば、GetLocaleInfoでこれを取得できます)。

于 2012-06-11T15:26:31.990 に答える
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

于 2012-06-27T14:34:57.737 に答える