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

ASP.NET Core 8.0 MVC视图中法语重音字符显示乱码问题

ASP.NET Core 8.0 MVC 法语重音字符显示异常问题

我在使用ASP.NET Core 8.0 MVC开发应用时遇到一个问题:通过JavaScript动态生成的表格里,法语带重音的字符显示异常;但同一文件中直接渲染的表格里,这些字符显示正常。已经在_layout文件里设置了<meta charset="utf-8">标签。

异常代码(动态生成表格)

@model List<ViewListTable>
<head>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<script type="text/javascript">
    function f() {
        var myArray = [];

    @foreach (var d in Model)
    {
        @:myArray.push("@d.Name");
        @:console.log("@d.Name");
    }
        var cptData = myArray.length;
        var tableau = document.getElementById('tableau');
        var tbl = document.createElement("table");
        var x = 0;

        for (var i = 0; i < cptData / 3; i++) {
            var tr = document.createElement('tr');

            for (j = 0; j < 3; j++) {
                var td = document.createElement('td');

                if (x < cptData) {
                    var a = document.createElement('a');
                    var el_span = document.createElement('span');
                    var linkText = document.createTextNode(myArray[x]);
                    var tab = myArray[x];

                    el_span.setAttribute('style', 'color: #07C');
                    a.setAttribute('href', "'" + tab + "'");
                    a.setAttribute('class', 'button');
                    a.title = "Éditer les données de la table:";

                    a.appendChild(linkText);
                    el_span.appendChild(a);
                    td.appendChild(el_span);
                };
                x += 1;
                tr.appendChild(td)
            };
            tbl.appendChild(tr);
        }
        tableau.appendChild(tbl);
   }
    </script>
</head>
<body>
    <div id="tableau"></div>
    <script>
    f();
</script>
</body>

正常代码(直接渲染表格)

@model List<ViewListTable>
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
 </head>

 <body>
     <div class="container">
             <div class="col-6">
                 Liste des tables
             </div>
         <table class="table table-bordered table-striped">
             <thead>
                 <tr>
                     <th class="col-6">
                         Nom des tables de la BD
                     </th>
                 </tr>
             </thead>
             <tbody>
                 @foreach (var obj in Model)
                 {
                     <tr>
                         <td>@obj.Name</td>
                     </tr>
                 }
             </tbody>
         </table>
     </div>
 </body>
 </html>

截图说明

  • 异常显示截图:法语重音字符出现乱码
  • 正常显示截图:法语重音字符显示正确

问题原因及解决方案

原因

在Razor视图中直接把@d.Name输出到JavaScript字符串时,ASP.NET Core默认不会对特殊字符(比如法语重音)做JavaScript编码,导致字符在JS中解析异常。而直接渲染到HTML时,Razor会自动进行HTML编码,所以显示正常。

解决方法

推荐使用Json.Serialize()方法把模型数据序列化为合法的JavaScript对象,避免手动拼接字符串导致的编码问题:

@model List<ViewListTable>
<head>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<script type="text/javascript">
    function f() {
        // 直接序列化模型数据为JS数组
        var myArray = @Json.Serialize(Model.Select(d => d.Name));
        
        var cptData = myArray.length;
        var tableau = document.getElementById('tableau');
        var tbl = document.createElement("table");
        var x = 0;

        // 后续逻辑保持不变...
   }
    </script>
</head>
<body>
    <div id="tableau"></div>
    <script>
    f();
</script>
</body>

替代方案

如果不想整体序列化,也可以单独对每个字段做JavaScript编码:

@foreach (var d in Model)
{
    @:myArray.push("@HttpUtility.JavaScriptStringEncode(d.Name)");
}

但整体序列化的方式更简洁,也不容易出错。

额外检查

确保视图文件本身的编码为UTF-8(在Visual Studio中右键文件→属性→高级→编码选择UTF-8)。

内容的提问来源于stack exchange,提问作者Patrice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:35:54