C# XmlDocument.LoadXml()和XML声明编码属性
这可能是既定的,但我正在努力做到彻底;由于.NET的C# XmlDocument.LoadXml()和XML声明编码属性,c#,.net,C#,.net,这可能是既定的,但我正在努力做到彻底;由于.NET的string类型是UTF-16,因此XmlDocument.LoadXml(string)只需忽略XML声明中的encoding属性,由于文档包含在.NET字符串中,因此无论使用什么编码,都应该已转换为UTF-16?XML属性确定编码类型 比如说 <?xml version="1.0" encoding="utf-8" ?> 这就是它被读取的内容,然后它被转换为UTF-16字符串,但如果您希望看到UTF-16字符,则不会看到
string
类型是UTF-16,因此XmlDocument.LoadXml(string)
只需忽略XML声明中的encoding
属性,由于文档包含在.NET字符串中,因此无论使用什么编码,都应该已转换为UTF-16?XML属性确定编码类型
比如说
<?xml version="1.0" encoding="utf-8" ?>
这就是它被读取的内容,然后它被转换为UTF-16字符串,但如果您希望看到UTF-16字符,则不会看到,它们将丢失
从字符串的MSDN文档中:
字符串中的每个Unicode字符由Unicode标量定义
值,也称为Unicode代码点或序数(数字)值
使用Unicode字符。每个代码点都使用UTF-16编码
编码,并且编码的每个元素的数值为
由Char对象表示
这意味着,当您将XmlDocument.LoadXml()传递给带有XML头的字符串时,它必须表示编码为UTF-16。否则,实际的底层编码将与头中报告的编码不匹配,并将导致抛出XmlException
扩展解释如下:
为什么要忽略它?如果文档中显示utf-8,则无法将其加载为utf-16。那不行。还是我误解了你的问题?在我看来,应该忽略它,因为原始数据(无论来自何处)应该已经从where转换为UTF-16,因为它包含在.NET字符串中。我在发布此问题之前阅读了你链接的问题,但我个人使用LoadXml()没有问题使用
编码
属性设置为UTF-8(也不使用UTF-16)。在我看来,一旦内容以一种或另一种方式存储到字符串中,手动将编码属性始终更改为UTF-16将是烦人且毫无意义的,因为这始终是UTF-16。假设您以byte[]
的形式收到一个UTF-8编码的XML文档,并使用Encoding.UTF8.GetString(byte[])
;字符串显然是UTF-16,但是声明应该是UTF-8,这就是为什么我认为应该忽略它。