2009-09-17 25 views
1

我在HTTP POST(x-www-form-urlencoded)的接收端,其中一個字段包含一個XML文檔。我需要接收該文檔,查看幾個元素,並將其存儲在數據庫中(以備後用)。 該文檔採用UTF-8格式(並且具有相應的標題),並且可以包含大量奇怪的字符。在MSXML/ASP中解析UTF-8編碼的XML

當我收到的數據,這樣的:

Set xmlDoc = CreateObject("MSXML2.DOMDocument.3.0") 
xmlDoc.async = False 
xmlDoc.loadXML(Request.Form("xml")) 

的一切,我可以挖掘出DOM文檔仍然是UTF-8格式。 例如,這個文件(非常簡單):

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
ä 
</data> 

永遠是爲

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
ä 
</data> 

如果我看xmlDoc.XML,我得到這個:

<?xml version="1.0"?> 
<data> 
ä 
</data> 

它刪除來自頭文件的編碼(因爲我在VBScript中使用的任何字符串都是「encoding-agnostic」,這種說法是有道理的),但它仍然是一系列代表UTF-8編碼的字符cument。

就好像MSXML不關心標題中的編碼信息一樣。是MSXML的問題,還是與發佈數據的編碼?它是一種「雙重編碼」形式,首先是UTF-8(某些字符用幾​​個字節寫入),然後逐字節地進行urlen編碼(「ä」實際上是作爲%C3%A4發送的)。

我不想硬編碼任何東西,比如假設它始終是UTF-8(因爲它將來可能會是UTF-16)。我無法對任何其他字符集(如iso-8859-1)進行「硬轉換」,因爲數據可能包含西裏爾字母和阿拉伯字符。我應該如何解決這個問題?

回答

3

選項1

之前閱讀任何表單字段修改Response.CodePage值: -

Response.CodePage = 65001 

問題是表單數據的內容不被接收頁面瞭解是UTF-8編碼。因此,%C3%的A4數據被視爲兩個不同的ANSI字符。頁面Response.CodePage奇怪地影響了表單數據在沒有客戶端發送的字符集信息的情況下如何解碼。

選項2

修改源頁上的表格元件。下面的屬性添加到它: -

<form accept-charset="UTF-8" ...> 

這加強了在後的字符UTF-8編碼,並導致崗位攜帶所選擇的字符集,這給服務器,它需要的信息數據正確解碼數據。

選項3

最後,我個人的喜好,不要在表單POST XML作爲字段值。相反,通過將其他表單字段值作爲屬性或元素添加到XML中,然後使用XmlHttpRequest發佈XML來轉向它。對於導航,服務器返回一個URL,客戶端應該瀏覽的URL包含發佈數據的GUID句柄,以便服務器收到請求時可以採取適當的操作。然而,我意識到這是一項相當多的工作,在這種情況下,其他兩種選擇中的一種應該適合您。

0

由於增加了這種重寫的複雜性,選項3現在可以排除在外。

選項1在我看來很奇怪,即響應的代碼頁應該指示請求發生了什麼,但是如果事情的方式是這樣,那就這樣吧。

至於選項2,它不是一個真正的瀏覽器表單發佈,而是一個小型腳本客戶端(使用CURL)。由此產生的HTTP頭將會被添加到腳本化的請求中?

總之,我想這意味着MSXML只是簡單地忽略從字符串加載時xml頭中設置的任何編碼。

+0

@ionn:我有點困惑,你是@jstck團隊的一員嗎?對於選項2,您可以嘗試在發送的請求標頭中添加標頭「Accept-Charset:UTF-8」。然而,這也有點奇怪,因爲它實際上說明了所需的__response__字符集應該是什麼。我發現選項1更可靠。我不知道CURL,但是在腳本環境中,選項3是比較可取的,但是CURL可能不同。 – AnthonyWJones 2009-09-17 18:57:27