C# 使用System.Text.Json序列化韩文写入文件时如何输出原生韩文而非Unicode转义字符
问题根源
韩文字符被转义为\uXXXX格式是System.Text.Json序列化阶段的默认行为,和后续写入文件的编码设置无关。你调整Encoding.Unicode、Encoding.Default不生效,是因为序列化生成的jsonstring本身就已经是转义后的ASCII内容,换什么写入编码都不会把转义片段还原成原生韩文。
解决方法
只需要修改代码中传入的JsonSerializerOptions(即代码里的opt参数)配置,从序列化源头关闭非ASCII字符的转义,核心逻辑如下:
// 需引入命名空间:System.Text.Encodings.Web、System.Text.Unicode var opt = new JsonSerializerOptions { // 核心配置:指定编码器允许所有Unicode字符直接输出,不做转义 Encoder = JavaScriptEncoder.Create(UnicodeRanges.All), // 可选配置:根据需要是否开启JSON缩进格式化 WriteIndented = true }; // 后续原有逻辑保持不变即可 string jsonstring = JsonSerializer.Serialize<Data>(data, opt); File.WriteAllText(filePath, jsonstring, Encoding.UTF8);
上述使用的
JavaScriptEncoder、UnicodeRanges类型在.NET Core 3.0及以上、.NET 5+框架中为内置组件,无需额外安装第三方Nuget包。
注意事项
- 不需要修改写入文件的编码设置,继续使用
Encoding.UTF8即可:只要序列化阶段输出的是原生韩文字符,UTF8编码写入的文件可以被所有文本编辑器正常识别,还能比转义格式的JSON节省约60%的非ASCII字符对应的文件体积。 - 不推荐直接使用内置的
JavaScriptEncoder.UnsafeRelaxedJsonEscaping来实现不转义:这个宽松编码器会跳过对<、>、&等特殊HTML字符的转义,如果序列化的JSON内容会被直接嵌入HTML页面执行,存在XSS安全风险,优先用指定Unicode范围的编码器更安全。 - 该配置和Python中
json.dumps(ensure_ascii=False)的效果完全对等:Python的json库默认也是将非ASCII字符转义为\uXXXX格式,只有显式设置ensure_ascii=False才会输出原生的非ASCII文本,和C# System.Text.Json的默认行为逻辑一致。
内容的提问来源于stack exchange,提问作者user2523112
相关产品推荐
相关产品推荐

