如何读取含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
相关产品推荐
相关产品推荐

