现有应用程序将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?
- 任何其他相关细节。
答案 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()
编码为任何编码。