0

クライアント側のスクリプトは、テキスト入力内のテキストを取得し、それを XML ブロック内に「ラップ」して、MySQL データベースに情報を保存するサーバーに送信します。

入力値をラップする前の最初のステップとして、次のように「&」文字をエスケープします。

var copyright = copyright.replace(/&/g,"&");

結果の XML データ ブロックは、jquery のajaxメソッドを使用してサーバーに送信されます。

var copyright = copyright.replace(/&/g,"&"),
    xml = "<request><session>"+session+"</session><space>"+space_id+"</space><view>"+view_id+"</view><copyright>"+copyright+"</copyright></request>",
    url = "hidden URL";

    $.ajax({ 
        type: "POST", 
        url: url,
        contentType: "text/xml; charset=UTF-8", 
        dataType: "xml;charset=UTF-8",
        data: xml
    });

この操作の後、以前にデータベース内に保存されたコンテンツを取得して、Web ページ内に表示する必要があります。

$.ajax({ 
    type: "POST", 
    url: url,
    dataType: 'xml',
    data: xmlString, 
    success: function(xml) { 
          var XML = $(xml);
            // Process the data retrieved
    },
    error: function(jqXHR, textStatus, errorThrown) {
        var XML = $(jqXHR.responseText);
            console.log("error: "+textStatus+"\n"+errorThrown);
    }
});

アンパサンドが入力フィールドに入力されてから保存された場合、以前に保存された同じコンテンツを表示するページをロードしようとすると、ajax 呼び出しが中断されerror、次のエラーが発生してイベント ハンドラーが実行されます。

error: parsererror
Error: Invalid XML: <?xml version="1.0" encoding="UTF-8"?><response><target>    
<target_id>2095466</target_id>    
<plot>20029/13</plot>    
<builder>Lemminkäinen</builder>    
<housing_form>vm</housing_form>    
<block_name></block_name>    
<finnish_year>2013</finnish_year>    
<target_name>As Oy Helsingin Saukonranta</target_name>    
<target_address>Saukonpaadenranta 8</target_address>    
<office_space></office_space>    
<purpose></purpose>    
<reservations></reservations>    
<contacts></contacts>    
<infoflag>2</infoflag>    
<views>    
<view>    
<view_id>2095468</view_id>    
<copyright>B&M</copyright>    
</view>    
</views>    
</target>    
<status>OK</status><errormsg></errormsg></response> 

私が間違っているのは何ですか?文字を間違ってエスケープしていますか、それとも何か他のものですか?

この質問は重複しているように見えるかもしれませんが、アンパサンド文字が保存される前にエスケープされているため、私にはそうは思えません。エスケープ文字列に追加 (1 つ、次に 2 つ) を追加しようとしamp;ましたが、結果はまったく同じです。

4

2 に答える 2

2

問題は実際にはサーバー (私はアクセスできませんでした) から発生したことが判明しました。リクエストを処理するスクリプトは、アンパサンド文字がクライアント側にあったとしても、アンパサンド文字を正しくエスケープしませんでした。ベローは、XML で使用されるすべての (?) 特殊文字をエスケープする JavaScript 関数です。必要な場合に備えて:

function escapeXML(string){

    var str = string;
    str = str.replace(/\&/g,"&amp;");
    str = str.replace(/\>/g,"&gt;");
    str = str.replace(/\</g,"&lt;");
    str = str.replace(/\"/g,"&quot;");
    str = str.replace(/\'/g,"&apos;");

    return str;
}
于 2012-11-16T15:02:31.133 に答える
0

問題は、Shahidが指摘しているように、ノード内ののä特性です。テキストがUTF-8でデコードされる場合、は2文字のUTF-8エンコーディングの一部になります。したがって、UTF-8デコーダーはデコードを試みますが、これは有効な文字シーケンスではありません。の正しいUTF-8エンコード文字は、またはバイナリです。したがって、完全なUTF-8エンコードテキストはである必要があります。LemminkäinenbuilderLemminkäinenääiää0xC3, 0xA4Lemminkäinen

報告されたXMLデータをXMLファイルに保存してからWebブラウザーで開くと、Chrome( 「エンコードエラー」)、Firefox(「整形式ではない」)、Safari(「エンコード」)のすべての主要なWebブラウザーで失敗します。エラー")、MSIE("テキストコンテンツに無効な文字が見つかりました。 ")、およびOpera("エンコーディングの不正なバイトシーケンス ")。

XMLデータはサーバーから取得されたため、ビルダーデータを投稿したスクリプトがUTF-8文字セットを指定しなかった可能性があります(提供されたコードがそれを実行するものであるという兆候はありません)。これは、現在ではすでに修正されている古いスクリプトが原因である可能性がありますが、損傷はすでに発生しています。つまり、誤ったデータ形式がデータベースに追加されました。データベースへの手動入力も、サーバーのメンテナンス中に発生する可能性があります。

于 2012-10-23T03:36:38.373 に答える