You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 03:06:03