我正处于HTTP POST(x-www-form-urlencoded)的接收端,其中一个字段包含XML文档。我需要接收该文档,查看几个元素,并将其存储在数据库中(供以后使用)。 该文档采用UTF-8格式(并具有相应的标题),并且可以包含许多奇怪的字符。
当我收到数据时,如下:
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中使用的任何字符串都是“编码不可知”,这种情况很有意义),但它仍然是表示UTF-8编码文档的字符序列。 / p>
就好像MSXML不关心标题中的编码信息一样。是MSXML的问题,还是发布数据的编码?它是“双重编码”的一种形式,首先是UTF-8(某些字符用几个字节写入),然后逐字节地进行urlencoded(“ä”实际上是以%C3%A4的形式发送的。)
我不想硬编码任何东西,例如假设它总是UTF-8(因为它可能在将来某个时候是UTF-16)。我不能对任何其他字符集进行“硬转换”(例如iso-8859-1),因为数据可以包含西里尔字母和阿拉伯字符。我该怎么办呢?
答案 0 :(得分:3)
选项1
在阅读任何表单字段之前,请修改您的Response.CodePage值: -
Response.CodePage = 65001
问题是接收页面不能将表单数据的内容理解为UTF-8编码。因此,%C3%A4数据被视为两个不同的ANSI字符。 Response.CodePage页面奇怪地影响了在没有客户端发送的字符集信息的情况下表单数据的解码方式。
选项2
修改源页面上的表单元素。将以下属性添加到其中: -
<form accept-charset="UTF-8" ...>
这会强制对帖子中的字符进行UTF-8编码,并使帖子携带有关所选字符集的数据,从而为服务器提供正确解码数据所需的信息。
选项3
最后,我个人的偏好,不要在表单中将XML作为字段值发布。相反,通过将其他表单字段值作为属性或元素添加到XML中然后使用XmlHttpRequest
发布XML来转向它。对于导航,服务器返回客户端应导航到的URL,该URL将包含发布数据的GUID句柄,以便在服务器收到请求时可以采取适当的操作。但是我意识到,这是相当多的工作,在这种情况下,其他两个选项中的一个应该适合你。
答案 1 :(得分:0)
由于这种重写的复杂性增加,目前几乎可以排除选项3。
选项1对我来说似乎很奇怪,响应的代码页应该决定请求会发生什么,但如果是这样,那就这样吧。
对于选项2,它不是真正的浏览器表单发布,而是一个小脚本客户端(使用CURL)。从那里发送的HTTP标头会被添加到脚本化请求中吗?
总之,我想这意味着MSXML只是忽略了从字符串加载时在xml头中设置的任何编码。