.NET 8下C#实现Unicode转义与HTML实体解码方案咨询
解决.NET 8中JSON转义字符与HTML实体的转换问题
1. 处理JSON中的Unicode转义(含编码映射修正)
默认System.Text.Json反序列化时会自动转换标准Unicode转义(如\u00e1),但像\u009a这类属于Windows-1252编码的控制字符范围,Unicode原生\u009a是不可打印控制字符,而业务需要的是Windows-1252对应的š(Unicode码位U+0161),需手动做编码映射:
实现代码
// 将含特殊Unicode转义的字符串按Windows-1252编码重新解析 string escapedStr = "M\u00e1le\u009aević"; byte[] unicodeBytes = Encoding.Unicode.GetBytes(escapedStr); string windows1252Text = Encoding.GetEncoding(1252).GetString(unicodeBytes); // 此时windows1252Text中的\u009a已转为š
若使用System.Text.Json反序列化,可配置保留原始转义后再处理:
var options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, PropertyNameCaseInsensitive = true }; var rawData = JsonSerializer.Deserialize<YourDataModel>(jsonResponse, options); // 后续对rawData的属性执行编码转换
2. 解码HTML实体
针对ć这类HTML实体,可通过两种方式解码:
方法一:依赖System.Web程序集
using System.Web; string htmlEncodedStr = "M\u00e1le\u009aević"; string decodedStr = HttpUtility.HtmlDecode(htmlEncodedStr); // decodedStr中ć已转为ć
方法二:无依赖原生解码(.NET 8推荐)
using System.Text.Encodings.Web; string htmlEncodedStr = "M\u00e1le\u009aević"; string decodedStr = HtmlEncoder.Default.Decode(htmlEncodedStr);
3. 完整转换流程
将编码映射与HTML解码结合,封装成通用方法:
public string CleanResponseText(string input) { if (string.IsNullOrEmpty(input)) return input; // 步骤1:处理Windows-1252编码的Unicode转义 byte[] unicodeBytes = Encoding.Unicode.GetBytes(input); string windows1252Text = Encoding.GetEncoding(1252).GetString(unicodeBytes); // 步骤2:解码HTML实体 return HtmlEncoder.Default.Decode(windows1252Text); } // 调用示例 var rawData = JsonSerializer.Deserialize<YourDataModel>(jsonResponse); rawData.LastName = CleanResponseText(rawData.LastName); rawData.Street = CleanResponseText(rawData.Street);
4. 存入SQL Server的注意事项
- 确保表字段类型为
NVARCHAR(而非VARCHAR),NVARCHAR支持全Unicode字符,能正确存储š、ć等非ASCII符号。 - 使用参数化查询插入数据,避免编码异常:
using (var conn = new SqlConnection(yourConnectionString)) { conn.Open(); string sql = "INSERT INTO Customer (LastName, Street) VALUES (@LastName, @Street)"; using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@LastName", rawData.LastName); cmd.Parameters.AddWithValue("@Street", rawData.Street); cmd.ExecuteNonQuery(); } }
特殊情况说明
若API返回的Unicode转义是标准Unicode(而非Windows-1252映射),直接反序列化即可自动转换,无需编码映射步骤。可先测试单字符转换结果,判断是否需要该步骤。
内容的提问来源于stack exchange,提问作者freudi
相关产品推荐
相关产品推荐

