.NET 6 MVC多语言Web应用中JS脚本内资源字符串无法正常显示Unicode字符
Hey,我碰到过几乎一模一样的问题!从.NET Framework 4.8迁移到.NET 6后,C#代码里的多语言资源显示正常,但JS里的资源全变成了\u开头的Unicode转义序列,德语变音符号、波斯语这些都没法正常显示。折腾了一阵后,终于找到几个靠谱的解决办法,分享给你:
核心原因
.NET 6默认的JSON序列化和Razor视图输出策略,会把非ASCII的Unicode字符转义成\uXXXX格式,而.NET Framework 4.8在处理这类场景时更宽松,直接输出原始字符。这就是为什么之前正常,迁移后出问题的关键。
解决方案1:在Razor视图中正确注入资源到JS
如果你是通过Razor视图把资源直接赋值给JS变量,别直接用@Resources.MyString,因为默认Razor会做HTML编码,放到JS里就会变成转义字符。正确的做法是结合Html.Raw和JSON序列化,既避免编码问题,又能处理JS特殊字符(比如引号、换行):
<script> // 用Json.Serialize处理JS特殊字符,Html.Raw避免转义Unicode var myLocalizedText = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Resources.MyString)); console.log(myLocalizedText); // 现在应该能正常显示Unicode字符了 </script>
解决方案2:全局配置JSON序列化行为
如果你的项目里有很多地方需要在JS中使用资源(比如通过AJAX获取资源接口),可以全局配置JSON序列化选项,让它直接输出Unicode字符而不是转义序列。在Program.cs中修改服务配置:
builder.Services.AddControllersWithViews() .AddJsonOptions(options => { // 配置编码器,允许直接输出Unicode字符 options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping; });
配置后,不管是通过Json()方法返回资源,还是在视图中用Json.Serialize,都会直接输出原始Unicode字符,不用再单独处理。
解决方案3:检查AJAX接口的响应编码
如果是通过AJAX请求后端接口获取资源,还要确保响应头里的Content-Type包含charset=utf-8。不过.NET 6默认已经配置了这个,但保险起见,可以在控制器方法里显式指定:
public IActionResult GetLocalizedResources() { var resourceData = new { WelcomeText = Resources.Welcome, ErrorMessage = Resources.Error }; // 显式指定UTF-8编码 return Json(resourceData, new JsonSerializerOptions { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); }
额外检查点
- 确认你的资源文件(.resx)的“自定义工具”是
ResXFileCodeGenerator,访问修饰符是public(这些应该和4.8时一致,不过还是确认下); - 确保视图文件的编码是UTF-8(右键视图文件→属性→高级→编码选择UTF-8)。
试试上面的方法,应该能解决你的问题!
备注:内容来源于stack exchange,提问作者Hita Barasm

