C#调用新浪滚动新闻接口获取的Unicode序列无法转为可读中文问题
C# Unicode转义序列解码解决方案
错误原因
你当前的编码转换逻辑完全偏离了问题本质:你拿到的v1是标准JSON格式的Unicode转义序列,不是字符编码不匹配问题,不需要在UTF-8和Windows-1252之间做编码互转。
解决方法
方法1:原生JSON反序列化(推荐,适配.NET Core 3.0+ / .NET 5+)
直接将转义字符串包装为合法JSON字符串后反序列化,框架会自动处理所有转义逻辑:
using System.Text.Json; // 拿到v1后直接执行以下代码 string decodedText = JsonSerializer.Deserialize<string>($"\"{v1}\""); MessageBox.Show(decodedText);
方法2:正则替换(兼容.NET Framework老版本)
如果使用.NET Framework 4.x及更低版本,没有内置System.Text.Json,可以用正则匹配手动转义:
using System.Text.RegularExpressions; string decodedText = Regex.Replace(v1, @"\\u([0-9a-fA-F]{4})", match => { return ((char)Convert.ToInt32(match.Groups[1].Value, 16)).ToString(); }); MessageBox.Show(decodedText);
方法3:完整解析JSONP结构(最稳妥)
你当前手动用Split切割字符串的逻辑容错性极低,一旦返回内容中包含特殊字符就会取值错误,直接解析完整JSONP结构更可靠:
using (WebClient client = new WebClient()) { client.Encoding = Encoding.UTF8; string v = client.DownloadString("https://feed.mix.sina.com.cn/api/roll/get?pageid=155&lid=1686&num=1&page=1&callback=feedCardJsonpCallback&_=" + DateTime.Now.ToString("HHmmss")); // 移除JSONP外层的函数包裹 string pureJson = v.TrimStart("feedCardJsonpCallback(".ToCharArray()).TrimEnd(')', ';'); // 解析JSON结构直接取title字段 using JsonDocument doc = JsonDocument.Parse(pureJson); string title = doc.RootElement .GetProperty("result") .GetProperty("data")[0] .GetProperty("title") .GetString(); MessageBox.Show(title); }
内容的提问来源于stack exchange,提问作者user2349425
相关产品推荐
相关产品推荐

