【问题标题】:System.Text.json JsonSerializer unicode issue on read from json fileSystem.Text.json JsonSerializer unicode 问题从 json 文件读取
【发布时间】:2022-01-19 20:21:15
【问题描述】:

在 C# .net 核心环境中,使用 System.Text.Json unicode 字符进行替换。例如“ü”在将json文件读入一个对象列表后显示为另一个符号

Passwort zurücksetzen

变成

Passwort zur�cksetzen

我尝试设置 json 选项:

JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
this.messageTemplates = 
JsonSerializer.Deserialize<List<MessageTemplate>>(messageTemplateJsonData, jso);

这并没有改变行为。

有什么想法吗?

更新:问题已解决

正如 diogoaos 所怀疑的那样,问题不会发生在 json 反序列化器中,而是在从文件中读取 json 文档时预先发生的。所以解决方案是将文件保存为 utf-8 并为文件阅读器设置编码:

string messageTemplateJsonData = File.ReadAllText(messageTemplatesFilename, System.Text.ASCIIEncoding.UTF8);
JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
this.messageTemplates = JsonSerializer.Deserialize<List<MessageTemplate>>(messageTemplateJsonData, jso);

【问题讨论】:

  • 您如何显示您的数据?您有非 ASCII Unicode 字符,只有当您的 UI 或控制台设置为正确的字符集时才能显示。
  • 我将数据打印到控制台。但是控制台通常会显示一个“ü”
  • 您在另一台计算机上吗?您是否更改了代码页?如果您使用的代码页没有“ü”,那么您会看到。文件是以 Unicode 格式存储的,还是只是假设一种编码?

标签: c# unicode system.text.json


【解决方案1】:

这似乎是在此上下文之外发生的问题。也许您正在不具有相同默认编码的组件之间传输此字符串,或者正在读取具有与 CLR 的默认编码不同的编码的文件。

在对您的问题发表评论时,您说“我将数据打印到控制台”。你能打印原始字符串吗(在反序列化之前,这个 messageTemplateJsonData 对象)?他的角色显示正确吗?

或者你可以用这个字符在内部创建一个字符串(不是从外部读取,而是在你的代码中创建一个文字)并查看是否发生错误。

我尝试在 Csharp 笔记本(在 vscode 中)上重现此问题,并得到了正确的结果,但这是 .Net 6,因此可能是版本问题。

【讨论】:

  • 你是对的!问题开始于从文件中读取 json。我必须以 utf-8 格式保存文件,并且特殊字符已按预期显示。谢谢!
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多