Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止从SQL Server检索XML时在XML中出现非法字符_C#_Regex_Web Services_Xml Serialization_Illegal Characters - Fatal编程技术网

C# 如何防止从SQL Server检索XML时在XML中出现非法字符

C# 如何防止从SQL Server检索XML时在XML中出现非法字符,c#,regex,web-services,xml-serialization,illegal-characters,C#,Regex,Web Services,Xml Serialization,Illegal Characters,有时我的类中属性的字符串值会变得奇怪。它们包含非法字符,显示方式如下(带方框): 我假设这些是非法/无法识别的字符。我将所有对象序列化为XML,然后通过Web服务上传它们。当我再次检索它们时,一些字符被替换为奇数。这种情况最常见于使用Word键入的连字符和破折号。这就是原因吗 我是否可以通过正则表达式或其他方式检查字符串是否包含这些无法识别的字符?定义允许的字符并阻止所有其他字符,例如: // only lowercase letters and digits if(Regex.IsMatch(

有时我的类中属性的字符串值会变得奇怪。它们包含非法字符,显示方式如下(带方框):

我假设这些是非法/无法识别的字符。我将所有对象序列化为XML,然后通过Web服务上传它们。当我再次检索它们时,一些字符被替换为奇数。这种情况最常见于使用Word键入的连字符和破折号。这就是原因吗


我是否可以通过正则表达式或其他方式检查字符串是否包含这些无法识别的字符?

定义允许的字符并阻止所有其他字符,例如:

// only lowercase letters and digits
if(Regex.IsMatch(yourString, @"^[a-z0-9]*$"))
{
    // allowed
}
但我认为您的问题可能在其他地方,因为您说它来自序列化(有效)字符串,然后反序列化(无效)字符串。可能是因为您使用了默认序列化,并且没有为类应用适当的
ISerializable
实现(或者正确使用
Serializable
属性),导致正在序列化的属性或字段不希望被序列化

PS:其他人提到了编码问题,这是一个可能的原因,可能意味着您根本无法读回数据。关于编码,有一条简单的规则:在任何地方(流、数据库、xml)使用相同的编码,并且要具体。如果不是,则使用默认编码,这可能因系统而异


编辑:可能的解决方案 根据新的信息(参见原始问题下的线程),很明显问题与编码有关。OP提到它以破折号出现,在某些奇特的编辑环境中使用时,破折号通常会被诸如“-”(
—
)之类的漂亮破折号所取代。由于在如何修复SQL Server以接受正确的编码字符串方面似乎存在一些不确定性,所以您也可以在XML中解决这个问题

创建XML时,只需将编码更改为最基本的编码(
US-ASCII
)。这将自动强制XML编写器使用正确的数字实体。当您反序列化时,这将在字符串中正确解析,无需进一步ado。大致如下:

Stream stream = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.ASCII;
XmlWriter writer = XmlWriter.Create(stream, settings);
// make sure to output the xml-prolog header
但是要注意使用
StringBuilder
StringWriter
,因为它固定使用UTF-16,并且XmlWriter将始终使用该编码进行写入,这与SQL Server不兼容

注意:使用ASCII编码时,任何高于
0x7F
的字符都将被编码。因此,é将看起来像
é
,破折号可能看起来像
,但这意味着相同,您不必担心这一点。每个支持XML的工具都将正确解释此输入


注意2:您想要更改XML编写方式的位置是您提到的Web服务,它接收XML,然后将其存储到SQL Server数据库中。在存储到SQL Server之前,必须应用更改。链的前面部分是无用的。

定义允许的字符并阻止所有其他内容,即:

// only lowercase letters and digits
if(Regex.IsMatch(yourString, @"^[a-z0-9]*$"))
{
    // allowed
}
但我认为您的问题可能在其他地方,因为您说它来自序列化(有效)字符串,然后反序列化(无效)字符串。可能是因为您使用了默认序列化,并且没有为类应用适当的
ISerializable
实现(或者正确使用
Serializable
属性),导致正在序列化的属性或字段不希望被序列化

PS:其他人提到了编码问题,这是一个可能的原因,可能意味着您根本无法读回数据。关于编码,有一条简单的规则:在任何地方(流、数据库、xml)使用相同的编码,并且要具体。如果不是,则使用默认编码,这可能因系统而异


编辑:可能的解决方案 根据新的信息(参见原始问题下的线程),很明显问题与编码有关。OP提到它以破折号出现,在某些奇特的编辑环境中使用时,破折号通常会被诸如“-”(
—
)之类的漂亮破折号所取代。由于在如何修复SQL Server以接受正确的编码字符串方面似乎存在一些不确定性,所以您也可以在XML中解决这个问题

创建XML时,只需将编码更改为最基本的编码(
US-ASCII
)。这将自动强制XML编写器使用正确的数字实体。当您反序列化时,这将在字符串中正确解析,无需进一步ado。大致如下:

Stream stream = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.ASCII;
XmlWriter writer = XmlWriter.Create(stream, settings);
// make sure to output the xml-prolog header
但是要注意使用
StringBuilder
StringWriter
,因为它固定使用UTF-16,并且XmlWriter将始终使用该编码进行写入,这与SQL Server不兼容

注意:使用ASCII编码时,任何高于
0x7F
的字符都将被编码。因此,é将看起来像
é
,破折号可能看起来像
,但这意味着相同,您不必担心这一点。每个支持XML的工具都将正确解释此输入


注意2:您想要更改XML编写方式的位置是您提到的Web服务,它接收XML,然后将其存储到SQL Server数据库中。在存储到SQL Server之前,必须应用更改。链的前面部分是无用的。

我个人认为使用正则表达式检查这些字符不是正确的解决方案。如果您没有存储这些字符,那么显然存在某种编码问题

验证XML文档本身是否使用正确的编码进行存储,以支持需要存储的字符。然后,验证在中读取文件时使用的编码是否与