1

所以今天早上我遇到了这个错误String,将 Sql Server 2008 R2 保存为一个XML数据类型,该数据类型表示XML通过 Web 服务发送的整个文档。保存从 Sql 抛出“非法 xml 字符”错误的特殊字符失败。特殊字符是一个要点—— •。

我相信在构建 Web 服务时,我只需要尝试对可能来自用户的任何输入进行编码XML,我通过创建一个XElement数组来消耗我想要通过 Web 服务发送的对象上的每个属性。我最初的想法是使用 System.Web.HttpUtility.HtmlEncode() 方法将任何和所有用户输入编码为适当的 HTML 思维,这会使 Sql 高兴,但事实并非如此;仍然出现相同的错误。

我知道 Sql Server 的 XML 数据类型是 UTF-16,但我对所有这些编码内容的理解还不够好,无法找到解决方案。任何人都可以提供任何帮助或指出我正确的方向吗?

4

1 回答 1

1

System.Web.HttpUtility.HtmlEncode()不会转义非 ASCII 字符 - 它依赖于将您的 XML 写入String二进制文件的任何字符编码,以另一端期望的方式处理此问题。在您的情况下,这显然不会发生。

关于 XML 数据格式的SQL Server 文档对于此处的预期行为没有多大帮助。如果<?xml version="1.0" encoding="UTF-8"?>您的 XML 序言(例如 )中String提到了编码,我将首先删除它并查看会发生什么。

否则,您将需要自己的方法来转义非 ASCII 字符。这是我之前做的一个:

static public String EscapeNonASCIIChars(String xml)
{
    StringBuilder sb = new StringBuilder(xml.Length);
    char highSurrogate = '\0';
    foreach (char c in xml)
    {
        if (c < 128)
            sb.Append(c);
        else if (c >= 0xd800 && c <= 0xdbff)
            highSurrogate = c;
        else if (c >= 0xdc00 && c <= 0xdfff)
            sb.Append(string.Format("&#x{0:x};", 0x10000 + ((int) (highSurrogate & 0x3ff) << 10 | (c & 0x3ff))));
        else 
            sb.Append(string.Format("&#x{0:x};", (int) c));
    }
    return sb.ToString();
}
于 2013-11-13T18:54:38.163 回答