JSON文件Unicode字符乱码问题:Facebook导出数据C#读取异常求助
嘿,这个乱码问题我太熟悉了!你遇到的“é”变成“é”是典型的编码不匹配导致的,本质是UTF-8格式的字节被错误地用单字节编码(比如Latin-1/Windows-1252)解码了。结合你给出的代码和场景,我给你几个针对性的解决方案:
问题根源
Facebook导出的个人数据JSON文件通常是UTF-8编码,但可能带有UTF-8 BOM(字节顺序标记),或者你的读取代码没有正确适配文件的编码规则,导致特殊字符解码出错。
解决方案
按顺序试试这几个方法:
替换编码参数为
Encoding.UTF8
.NET里的Encoding.UTF8会自动识别并跳过UTF-8 BOM,而你用的Encoding.GetEncoding("utf-8")不会处理BOM,可能导致开头的标记字符干扰后续解析。修改你的代码:private static ListMessages ReadJSON(string path) { using (StreamReader r = new StreamReader(path, Encoding.UTF8)) { string json = r.ReadToEnd(); ListMessages messages = JsonConvert.DeserializeObject<ListMessages>(json); return messages; } }确认文件的实际编码
拿Notepad++打开你的JSON文件,看右下角显示的编码(比如“UTF-8”、“UTF-8-BOM”、“Windows-1252”)。如果是Windows-1252,就把StreamReader的编码改成Encoding.GetEncoding(1252);如果是Latin-1,用Encoding.GetEncoding("ISO-8859-1")。修复已读取的乱码文本
要是已经读入了乱码的字符串,还可以通过重新编码来挽救:// 假设json是已经乱码的字符串 byte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(json); string fixedJson = Encoding.UTF8.GetString(bytes); ListMessages messages = JsonConvert.DeserializeObject<ListMessages>(fixedJson);这个操作的逻辑是:把乱码的字符串按错误的编码(ISO-8859-1)转回原始字节,再用正确的UTF-8解码,就能恢复原本的特殊字符。
验证小技巧
修改代码后,特意输出几个包含“é”这类特殊字符的消息内容,确认是否正常显示。要是还有问题,检查你的ListMessages类是否用[JsonProperty]正确标记了字段,确保JSON和实体类的映射没出错。
内容的提问来源于stack exchange,提问作者Shrin

