2009-09-17 21 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