1

现有应用程序在SQLServer 2000中将XML传递给一个sproc,输入参数数据类型为TEXT;XML 派生自 Dataset.GetXML()。但我注意到它没有指定编码。

因此,当用户将不适当的字符潜入数据集中时,特别是 ASCII 146(似乎是撇号)而不是 ASCII 39(单引号)时,存储过程会失败。

一种方法是在 GetXML 的结果前面加上

<?xml version="1.0" encoding="ISO-8859-1"?>

它在这种情况下有效,但是确保存储过程不会崩溃(如果弹出其他无法预料的字符)的更正确方法是什么?

PS。我怀疑用户在 MS-Word 或类似的编辑器中输入文本,然后复制并粘贴到应用程序的输入字段中;我可能希望允许用户继续以这种方式工作,只需要防止崩溃。

编辑:我正在寻找确认或否认几个方面的答案,例如:
-根据标题,如果 XML 中没有指定,默认编码是什么?
- 编码 ISO-8859-1 是否适合使用?
- 如果有更好的编码可以包含英语世界中的更多字符,因此不太可能导致存储过程中的错误?
- 您是否会在应用程序的 UI 级别过滤标准 ASCII(仅 0 到 127),并且不允许扩展 ASCII?
- 任何其他相关细节。

4

2 回答 2

0

我相信您的方法应该是使用 WriteXml 而不是 GetXml。那应该允许您指定编码。

但是,请注意,您必须通过中间流写入 - 如果您直接输出到字符串,它将始终使用 UTF-16。由于您使用的是 TEXT 列,这将允许对 TEXT 无效的字符。

于 2009-12-09T19:06:57.277 回答
0

DataSet.GetXml()返回一个string。在 .NET 中,字符串在内部使用 UTF-16 进行编码,但这在这里并不重要。

字符串中没有<?xml encoding=...>声明的原因是因为该声明仅在解析字节流中的 XML 时有用或需要。.NET 字符串不是字节流,它只是具有明确定义的代码点语义(即 Unicode)的文本,因此在那里不需要它。

如果没有 XML 编码声明,则在没有 BOM 的情况下,XML 解析器将采用 UTF-8。但是,在您的情况下,它也完全无关紧要,因为问题不在于 XML 解析器(当 XML 存储在TEXT列中时,SQL Server 不会对其进行解析)。问题是您的 XML 包含一些 Unicode 字符,并且TEXT是非 Unicode SQL 类型。

您可以string使用方法将 a 编码为任何编码Encoding.GetBytes()

于 2009-12-09T23:34:51.057 回答