.NET DataSet.GetXml() - 什么是默认编码?

时间:2009-12-09 18:52:16

标签: xml encoding dataset xml-parsing

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

因此,当用户将不适当的字符隐藏到数据集中时,特别是ASCII 146(似乎是撇号)而不是ASCII 39(单引号)时,sproc会失败。

一种方法是使用

为GetXML的结果添加前缀
<?xml version="1.0" encoding="ISO-8859-1"?>

它适用于这种情况,但是什么是更正确的方法来确保sproc不会崩溃(如果弹出其他无法预料的字符)?

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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