You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取含Unicode字符的ODATA Web Service XML数据并存入DataSet

解决DataSet读取OData XML时的Unicode字符问题

嘿,这个坑我踩过!直接用DataSet.ReadXml(URLString)的时候,.NET默认的编码检测逻辑有时候没法正确识别OData服务返回的Unicode编码(比如UTF-8无BOM的情况),导致Unicode字符乱码或者丢失。

最简的解决方法是手动控制编码,先通过HTTP客户端获取正确编码的数据流,再交给DataSet读取,下面给你两种常用的实现方式:

方式一:用HttpClient(异步推荐)

这是.NET Core/现代.NET项目的首选方式,代码简洁且异步友好:

using System.Net.Http;
using System.IO;
using System.Text;

string URLString = "SomeUrl";
DataSet ds = new DataSet();

using (HttpClient client = new HttpClient())
{
    // 从OData服务获取数据流
    using (Stream stream = await client.GetStreamAsync(URLString))
    {
        // 指定UTF-8编码(OData标准返回编码)创建StreamReader
        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
        {
            ds.ReadXml(reader);
        }
    }
}

方式二:用WebClient(同步场景)

如果是传统.NET Framework的同步代码,用WebClient更简单:

using System.Net;
using System.Text;

string URLString = "SomeUrl";
DataSet ds = new DataSet();

using (WebClient client = new WebClient())
{
    // 直接指定UTF-8编码
    client.Encoding = Encoding.UTF8;
    using (Stream stream = client.OpenRead(URLString))
    {
        ds.ReadXml(stream);
    }
}

为什么这能解决问题?

OData服务返回的XML通常是UTF-8编码,但DataSet.ReadXml(string)的默认逻辑可能会错误地使用系统默认编码(比如GB2312)去解析,导致Unicode字符损坏。手动指定UTF-8编码后,StreamReader会按照正确的编码规则读取字符,确保所有Unicode内容都能被DataSet正确解析并存入。

内容的提问来源于stack exchange,提问作者Maor.I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:56:51