1

我在 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 编码文档的字符序列。

就好像 MSXML 不关心标头中的编码信息一样。是 MSXML 的问题,还是帖子数据的编码问题?它是“双重编码”的一种形式,首先是 UTF-8(其中某些字符用几​​个字节写入),然后是一个字节一个字节的 urlencoded(“ä”实际上是作为 %C3%A4 发送的)。

我不想硬编码任何东西,比如假设它总是 UTF-8(因为它很可能在未来的某个时候是 UTF-16)。我也不能对任何其他字符集(例如 iso-8859-1)进行“硬转换”,因为数据可以包含西里尔字母和阿拉伯语字符。我应该如何解决这个问题?

4

2 回答 2

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. 对于导航,让服务器返回一个 URL,客户端应导航到该 URL,该 URL 将包含已发布数据的 GUID 句柄,以便当服务器接收到请求时,它可以采取适当的操作。然而,我意识到,这一切都需要更多的工作,在这种情况下,其他两个选项之一应该适合你。

于 2009-09-17T14:25:19.833 回答
0

由于这种重写增加了复杂性,目前几乎可以排除选项 3。

选项 1 对我来说似乎很奇怪,响应的代码页应该规定请求会发生什么,但如果是这样,那就这样吧。

至于选项 2,它并不是真正的浏览器表单发布,而是一个小型脚本客户端(使用 CURL)。从中发送的结果 HTTP 标头是什么,可以添加到脚本请求中?

总之,我猜这意味着 MSXML 在从字符串加载时会忽略 xml 标头中设置的任何编码。

于 2009-09-17T18:01:42.610 回答