Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 为什么xmltextreader会自动将html编码的utf8字符转换为utf8字符串?_.net_Xml_Encoding_Xmltextreader - Fatal编程技术网

.net 为什么xmltextreader会自动将html编码的utf8字符转换为utf8字符串?

.net 为什么xmltextreader会自动将html编码的utf8字符转换为utf8字符串?,.net,xml,encoding,xmltextreader,.net,Xml,Encoding,Xmltextreader,我收到一个编码为“ISO-8859-1”(拉丁语-1)的XML文件 在文件中(在其他标记中),我有示例“content”和─ 现在由于某种原因,当我将其加载到XMLTextReader并执行“XmlReader.Value”返回值时,它返回:“content”和─ 当面对一个只接受拉丁-1编码的数据库时,这显然是错误的 我尝试了以下方法: 转换为字节并使用 编码。从UTF-8转换为更改 转换成拉丁语-1(成功地 给我一堆“?”代替) 使用 StreamReader(文件,编码,随便什

我收到一个编码为“ISO-8859-1”(拉丁语-1)的XML文件

在文件中(在其他标记中),我有
示例“content”和─

现在由于某种原因,当我将其加载到XMLTextReader并执行“XmlReader.Value”返回值时,它返回:“content”和─

当面对一个只接受拉丁-1编码的数据库时,这显然是错误的

我尝试了以下方法:

  • 转换为字节并使用 编码。从UTF-8转换为更改 转换成拉丁语-1(成功地 给我一堆“?”代替)
  • 使用 StreamReader(文件,编码,随便什么) 将文件加载到XmlTextReader中
在互联网上和你自己身上有几种不同的方法

我知道.NET字符串是UTF-16,但我不明白的是为什么,当存在UTF-8字符时,它是一个具有正确标记的完全拉丁-1格式的XML文件,它与旧数据库和web(用于HTML标记等)兼容,它只是覆盖了UTF-8编码的字符串,并且输出的是UTF-8编码的字符串


除了编写自己的自定义文本解析器之外,还有其他方法可以解决这个问题吗?

我不认为这是编码的问题。您看到的是XML字符串被取消转义

问题是
是一个XML转义字符,因此XMLTextReader将为您取消转义

如果您更改此选项:

<OtherText>Example &quot;content&quot; And &#9472;</OtherText>
您需要将您的值包装在CDATA中,以便解析器忽略它

另一个选项是重新转义字符串:

    using System.Security;
....
....
    string val = SecurityElement.Escape(xmlReader.Value);

这很有道理。我已经盯着数据看了将近12个小时,但没有注意到!问题是数据是提供给我的,所以我无法对它进行任何更改,除非我写一些东西来更改所指示的符号。让我吃惊的是,它们在文本中也使用了&;。SecurityElement.Escape似乎然而,对于─;它似乎没有识别出它是UTF-8,并将其作为ASCII进行处理,即使MySQL不同意。关闭,但没有雪茄。它仍然会在ā这样的字符上出错(如您所指出的,这是正确编码的,除非不使用&;),因此SecurityElement.Escape()方法不起作用。看起来好像我必须自己做这件事,但在这个过程中没有以某种方式替换有效的&;。多亏了这一观察结果以及上面解释的方法的组合:Dim txt作为新StreamReader(文件路径)Dim memoryStream作为新memoryStream()Dim streamWriter作为新streamWriter(memoryStream)streamWriter.Write(txt.ReadToEnd.Replace(“&;”,“&”).Replace(“&;”,“&;”)streamWriter.Flush()memoryStream.Position=0 Dim xml作为新的xml.XmlTextReader(memoryStream)我能够成功地写入数据!非常感谢您为我指明了正确的方向!
   XmlReader.Value = "&quot;content&quot; And &#9472;";
    using System.Security;
....
....
    string val = SecurityElement.Escape(xmlReader.Value);