.NET Core Json.NET反序列化3字节Unicode字符Android浏览器显示异常
问题排查与解决方案
核心问题分析
你遇到的是Unicode特殊字符存储与跨平台渲染的双重问题:SQL Server存储时的编码丢失,以及Android系统字体对特殊Unicode字符的支持不足。
1. SQL Server存储异常解决
检查字段类型
确保存储Caption的数据库字段类型为nvarchar(max)(而非varchar)。varchar是单字节编码,无法容纳Unicode Supplementary Multilingual Plane(SMP)中的特殊字符(比如你示例中的𝌯、𝌞́这类字符),会导致字符乱码或丢失。
数据库写入规范
- 使用参数化查询写入数据,避免直接拼接SQL语句。参数化查询会自动处理Unicode字符的传递,防止编码转换错误:
using (var conn = new SqlConnection("你的数据库连接字符串")) { conn.Open(); var insertCmd = new SqlCommand("INSERT INTO 表名 (Caption) VALUES (@Caption)", conn); // 指定参数类型为NVarChar,确保Unicode支持 insertCmd.Parameters.Add("@Caption", SqlDbType.NVarChar, -1).Value = entity.Caption; insertCmd.ExecuteNonQuery(); }
- 确认连接字符串未禁用Unicode:SqlClient默认支持Unicode,无需额外配置;若使用OLEDB连接,需添加
Unicode=True参数。
2. Android浏览器显示异常解决
Android系统默认字体通常缺少对Unicode SMP字符的渲染支持,导致这类字符显示为方块或乱码。解决方式是在前端页面指定包含全Unicode字符集的字体:
/* 为包含特殊字符的元素指定字体 */ .caption-text { font-family: 'Segoe UI Emoji', 'Noto Color Emoji', 'Arial Unicode MS', sans-serif; }
这些字体(尤其是Noto Color Emoji)覆盖了绝大多数Unicode特殊字符的渲染需求,能在Android浏览器中正常显示目标字符。
3. C#代码验证
反序列化环节无需额外修改,Newtonsoft.Json默认会正确解析JSON中的Unicode转义序列,生成正确的.NET字符串(string类型本身就是Unicode编码)。若调试时看到的字符串已异常,需检查API返回的JSON是否被中间环节(比如代理、网关)篡改。
内容的提问来源于stack exchange,提问作者user11378344
相关产品推荐
相关产品推荐

