C# WPF 从嵌入资源JSON读取的带重音多语言字符显示为问号的问题
翻译工具类编码问题排查与修复
现有实现代码
namespace XCheck.Classes.Utilities { static class Translator { public static string Get(string key, string language) { JObject lang = JObject.Parse(ReadResource("XCheck.Properties.lang.json")); return (string)lang[key][language]; } public static string ReadResource(string name) { var assembly = Assembly.GetExecutingAssembly(); string resourcePath = name; using(Stream stream = assembly.GetManifestResourceStream(resourcePath)) using(StreamReader reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } } }
嵌入的JSON资源内容
{ "XCVersion": { "english": "XC Version", "spanish": "Versión XC" } }
UI赋值逻辑
parent.topPanelVersionText.Text = $"{Translator.Get("XCVersion", "spanish")}: {version.Major}.{version.Minor}";
异常表现
应用运行时,调用翻译方法获取西班牙语文本时,带重音的特殊字符会被渲染为问号;直接在XAML中给同一个TextBlock元素写入对应文本时,字符可以正常显示。
问题根因
异常来自StreamReader的默认编码匹配规则:
- .NET Framework 下
StreamReader的无参构造方法,会默认按照带BOM的UTF-8规则解码流内容 - 如果嵌入的JSON资源文件没有带UTF-8 BOM标记,解码逻辑就会回退到系统本地的ANSI编码规则,此时如果文件本身是UTF-8无BOM格式保存的,重音字符就会因为编码不匹配被解码为乱码,最终显示为问号。
修复步骤
- 修改
StreamReader初始化逻辑,显式指定解码编码为UTF-8,同时开启BOM自动检测能力:using(StreamReader reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true)) - 检查
lang.json文件的保存编码,确保文件是用UTF-8格式保存的,不要用系统默认的ANSI编码存储 - 临时增加调试断点,确认读取到的字符串中
Versión XC的ó字符没有被替换为乱码后,再传入JObject解析流程
注意:如果完成编码调整后仍有乱码,可以核对项目资源的生成操作设置,确认JSON文件确实作为嵌入资源正确打包到程序集中,没有被构建流程重新编码。
内容的提问来源于stack exchange,提问作者GrumpyCrouton
相关产品推荐
相关产品推荐

