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

.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&#263";
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实体

针对&#263;这类HTML实体,可通过两种方式解码:

方法一:依赖System.Web程序集

using System.Web;

string htmlEncodedStr = "M\u00e1le\u009aevi&#263";
string decodedStr = HttpUtility.HtmlDecode(htmlEncodedStr);
// decodedStr中&#263;已转为ć

方法二:无依赖原生解码(.NET 8推荐)

using System.Text.Encodings.Web;

string htmlEncodedStr = "M\u00e1le\u009aevi&#263";
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:23