【问题标题】:How to solve encoding problem reading feed如何解决编码问题阅读提要
【发布时间】:2018-11-01 20:30:47
【问题描述】:

https://sports.ultraplay.net/sportsxml?clientKey=b4dde172-4e11-43e4-b290-abdeb0ffd711&sportId=1165

我正在尝试在 .NET 环境中阅读此提要并遇到 BOM 问题(System.Xml.XmlException:'没有 Unicode 字节顺序标记。无法切换到 Unicode。)。我该如何解决?是不是因为xml内容没有xml声明标签?

我尝试了所有可能的方式来阅读提要,让我们举个例子:

XmlReader reader = XmlReader.Create(feedUrl);
var content = XDocument.Load(reader);

【问题讨论】:

    标签: c# .net web-services encoding feed


    【解决方案1】:

    显然,XML 声明似乎在这里丢了东西:

    <?xml version="1.0" encoding="utf-16"?>
    

    见:Loading xml with encoding UTF 16 using XDocument

    当您有一个使用 StreamReader 的 XML 文件时,该问题解决了这种情况。由于您是从网络下载文件,您可以使用OpenRead() 方法将WebClient 调整为StreamReader,如下所示:

    string feedUrl = "https://sports.ultraplay.net/sportsxml?clientKey=b4dde172-4e11-43e4-b290-abdeb0ffd711&sportId=1165";
    
    System.Xml.Linq.XDocument content;
    using (System.Net.WebClient webClient = new System.Net.WebClient())
    using (System.IO.Stream stream = webClient.OpenRead(feedUrl))
    using (System.IO.StreamReader streamReader = new System.IO.StreamReader(stream, Encoding.UTF8))
    {
        content = XDocument.Load(streamReader);
    }
    Console.WriteLine(content);
    

    奇怪的是,虽然文档声称是 UTF-16,但 HTTP 响应却说 UTF-8,这就是我在 StreamReader 构造函数中指定它的原因。

    HTTP/1.1 200 OK
    Date: Fri, 02 Nov 2018 16:28:46 GMT
    Content-Type: application/xml; charset=utf-8
    

    这似乎运作良好:)

    【讨论】:

    • 嗯,它是 UTF8 编码的,因为你要求它是这样的。这并不意味着原始页面编码是 UTF-8(实际上是 UTF-16)。 WebClient 使用指定的编码对结果数据字节进行编码。它不检查它是否与响应编码匹配。如果该页面使用不同的特定编码,您将得到乱码文本。我发布的相关内容:Kanji characters from WebClient html different from actual Kanji
    • 如果您不指定和编码,程序会检查这些的 BOM:Encoding.UTF8, Encoding.UTF32, Encoding.Unicode, Encoding.BigEndianUnicode。当然,网页往往是 UTF-8 编码的。但很多不是。
    • 不管怎样,我在 Fiddler 中收到了标题。此外,我还尝试了使用Encoding.Unicode 的 WebClient,但它失败了。 UTF-8 似乎可以解决问题。
    • 我的评论不是针对这个问题的。很高兴知道使用WebClient 属性指定的编码并不能保证下载的数据将被正确编码。恰恰相反。最好不要指定编码。除非有人确定那是什么。在我链接的答案中报告了这一点。此外,底层WebResponse 用于获取远程主机提供的实际编码。然后使用正确的编码重新编码byte[] 数据。当前的问题与文件编码的XmlReader 行为更相关。
    • 无论如何,根据 OP,这可能会解决直接的问题(以 Unicode 形式编码,以适应 XmlReader 的要求,如果这是工具)。如果文本不完全正确,这里有足够的信息来理解原因并修复它。
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 2011-05-06
    • 2018-09-01
    • 2017-10-03
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多