C# .NET编码中的字符串是否不可知?

C# .NET编码中的字符串是否不可知?,c#,C#,我的问题很简单:字符串在.net编码中是不可知的吗 我这样问是因为当我接收一个xml文件时,我知道该文件是用一些windows-1252代码页元素(即智能引号)编码的,在调试器中查看保存xml的字符串时,似乎希望将单个智能引号解析为一个带问号的三角形。这让我怀疑.NET是否断言保存XML的字符串是UTF8,因此无法解决差异 如果是这样的话,这就是一个问题,因为如果字符串被转换,那么我的Web服务将无法从我的文本中删除windows智能引号,因为它无法识别三角形/问号 请帮忙。。任何传入或传出的数

我的问题很简单:字符串在.net编码中是不可知的吗

我这样问是因为当我接收一个xml文件时,我知道该文件是用一些windows-1252代码页元素(即智能引号)编码的,在调试器中查看保存xml的字符串时,似乎希望将单个智能引号解析为一个带问号的三角形。这让我怀疑.NET是否断言保存XML的字符串是UTF8,因此无法解决差异

如果是这样的话,这就是一个问题,因为如果字符串被转换,那么我的Web服务将无法从我的文本中删除windows智能引号,因为它无法识别三角形/问号

请帮忙。

。任何传入或传出的数据都必须转换为该编码或从该编码转换而来

如果您使用适当的XML阅读库,它很可能会为您处理它,只要XML具有适当的XML prolog,但遵守XML规范不需要Windows-1252支持。

。任何传入或传出的数据都必须转换为该编码或从该编码转换而来


如果您使用适当的XML阅读库,它很可能会为您处理它,只要XML具有适当的XML prolog,但遵守XML规范不需要Windows-1252支持。

否,.NET中的字符串在有限的16位范围内存储为Unicode码点。对于溢出的,使用代理字符


请勿将上述内存中表示与存储表示混淆,存储表示高度依赖于所选的编码方案。

否,.NET中的字符串作为Unicode代码点存储在有限的16位范围内。对于溢出的,使用代理字符

请勿将上述内存中表示与存储表示混淆,存储表示高度依赖于所选的编码方案。

否。来源:

字符串是Unicode字符的顺序集合

编号:发件人:

字符串是Unicode字符的顺序集合

加载某个文本文件时,它默认将该文件解释为UTF-8或您告诉它使用的任何编码

由于没有显示任何源代码,我只能推测如何读取/加载XML,以及XML的序言中是否有正确的字符集。。。根据方法的不同,.NET将默认为UTF-8,并在内存中将其表示为UTF16

请提供更多的细节,如果上面没有帮助

加载某个文本文件时,它默认将该文件解释为UTF-8或您告诉它使用的任何编码

由于没有显示任何源代码,我只能推测如何读取/加载XML,以及XML的序言中是否有正确的字符集。。。根据方法的不同,.NET将默认为UTF-8,并在内存中将其表示为UTF16


如果以上内容没有帮助,请提供更多详细信息…

字符串类主要是编码不可知的。错误来自将字节解码为字符串的过程。这个过程不适合你。你需要告诉解码器使用你的特殊编码


为什么字符串大多是不可知的?这是因为它们将unicode字符编码为16位值的序列。但是,尽管16位的值只有64k个可能值,但unicode字符可以有大约100万个不同的值。因此,编码过程也需要进行。这是通过使用代理来实现的。string类本质上是UTF-16。

string类主要是编码不可知的。错误来自将字节解码为字符串的过程。这个过程不适合你。你需要告诉解码器使用你的特殊编码


为什么字符串大多是不可知的?这是因为它们将unicode字符编码为16位值的序列。但是,尽管16位的值只有64k个可能值,但unicode字符可以有大约100万个不同的值。因此,编码过程也需要进行。这是通过使用代理来实现的。字符串类本质上是UTF-16。

是智能引号字符串数据还是它们是分隔属性值,例如?如果是后者,那么您的XML是不兼容的;您需要用直接引号替换字符。此外,这个问题并不能真正解决您的问题-您真正想要做的只是更改库用于.xml文件的字符编码。看看这个:Som有帮助的阅读:智能引号是字符串数据还是分隔属性值,例如?如果是后者,那么您的XML是不兼容的;您需要用直接引号替换字符。此外,这个问题并不能真正解决您的问题-您真正想要做的只是更改库用于.xml文件的字符编码。看看这个:Som有用的阅读:和更多文档

请参阅System.Char@michaelmadsen,我正在使用LINQtoXML将我要查找的项提取到字符串集合中。因此我关心自动转换的原因。@michaelmadsen什么是xml阅读库?我正在使用linq to xml,这就是你所说的吗?@fullNelson:xml阅读库是一个阅读xml的库。如果您使用的是LINQ到XML,我希望它能为您处理编码转换,前提是XML正确指定它。@michael madsen我的客户提供的XML没有编码声明。我相当肯定他们使用的是Windows1252代码页,但也可能是他们在复制和粘贴xml。既然是这种情况,那么我不确定我能做多少来检测它们的编码。有关其他文档,请参阅System.Char@michaelmadsen,我正在使用linq to xml将我要查找的项提取到字符串集合中。因此我关心自动转换的原因。@michaelmadsen什么是xml阅读库?我正在使用linq to xml,这就是你所说的吗?@fullNelson:xml阅读库是一个阅读xml的库。如果您使用的是LINQ到XML,我希望它能为您处理编码转换,前提是XML正确指定它。@michael madsen我的客户提供的XML没有编码声明。我相当肯定他们使用的是Windows1252代码页,但也可能是他们在复制和粘贴xml。既然是这样,那么我不确定我能做多少来检测他们的编码。这是不正确的。代理项字符的存在没有顺序。@leppie代理项的存在不会阻止字符串成为Unicode字符的顺序集合。这意味着某些Unicode字符由多个字符编码,但字符串仍然是连续的。@leppie-此外,请接受microsoft的质疑,这是文档中的直接引用@WyattBarnett:MSDN是出了名的错误,特别是当您引用.NET 1.1文档时。@phoog:它不是顺序的,因为这意味着字符串索引是任何字符串的O1操作。这是不正确的。代理项字符的存在没有顺序。@leppie代理项的存在不会阻止字符串成为Unicode字符的顺序集合。这意味着某些Unicode字符由多个字符编码,但字符串仍然是连续的。@leppie-此外,请接受microsoft的质疑,这是文档中的直接引用@Wyatt Barnett:MSDN是出了名的错误,特别是当你引用.NET 1.1文档时。@phoog:它不是顺序的,因为这意味着字符串索引是任何字符串的O1操作。您的代理字符是否可能引用此菱形/问号?您的代理字符是否可能引用此菱形/问号?我正在使用linq读取xml,然后将其传递给字符串。我们的客户没有使用任何表示他们正在使用的编码的指示,但他们使用的是某种类型的1252或1254的windows代码表。@如果XML不包含所使用的编码,它将被解释为UTF-8。如果是其他内容,则XML是不一致的,因此任何符合标准的XML读取器都无法正确读取它。。。XML标准规定XML必须包含所用编码/字符集UTF-8的指示,默认情况下是例外@-yahia我的客户端没有发送带有编码声明的xml。但是,既然我知道他们试图发送什么,我可以在xml前面加一个声明来解决这个问题吗?@fullNelson-yes,这有点老套,但通过将文件视为二进制文件并重写它以包含编码声明,它应该可以修复它…@fullNelson通过FileStream打开它,并且不使用任何特定于文本的方法,如ReadLine等。。只需将其作为字节流读取,对标头进行必要的修改,并使用新名称保存文件。。。然后将新文件与Linq2XML一起使用,我用linq读取xml,然后将其传递给字符串。我们的客户没有使用任何表示他们正在使用的编码的指示,但他们使用的是某种类型的1252或1254的windows代码表。@如果XML不包含所使用的编码,它将被解释为UTF-8。如果是其他内容,则XML是不一致的,因此任何符合标准的XML读取器都无法正确读取它。。。XML标准规定XML必须包含所用编码/字符集UTF-8的指示,默认情况下是例外@-yahia我的客户端没有发送带有编码声明的xml。但是,既然我知道他们试图发送什么,我可以在xml前面加上一个声明来解决这个问题吗?@fullNelson是的,这有点黑客味,但是将文件视为二进制文件并重新
写入它以包含编码声明,它应该修复它…@fullNelson通过FileStream打开它,不要使用任何特定于文本的方法,如ReadLine等。。只需将其作为字节流读取,对标头进行必要的修改,并使用新名称保存文件。。。因为windows-1252代码列表声明它的双智能引号是132,所以它根本不会映射到utf8,因为utf8的代码点132是不同的。因此,将其更改为UTF16仍然不能解决问题。我没有建议这样做。我建议将XML阅读库配置为使用windows-1252编码。然后,它将使用此编码将输入字节解码为UTF-16的.NET字符串。我重复一遍:您的问题与string类无关。在哪里可以找到有关xml阅读库的更多信息。我从来没有听说过,我以为你在使用它,因为你在谈论XML。我一定是误解了你的意思。因为windows-1252代码列表声明它的双智能引号是132,所以它根本不会映射到utf8,因为utf8的代码点132是不同的。因此,将其更改为UTF16仍然不能解决问题。我没有建议这样做。我建议将XML阅读库配置为使用windows-1252编码。然后,它将使用此编码将输入字节解码为UTF-16的.NET字符串。我重复一遍:您的问题与string类无关。在哪里可以找到有关xml阅读库的更多信息。我从来没有听说过,我以为你在使用它,因为你在谈论XML。我一定是误解你了。