我正在使用 ServiceStack (v3.9.44.0) 作为一个 Windows 服务(目标是 .Net4.5),并且我使用 Razor 来让 ServiceStack 生成和提供 HTML。虽然一切运行良好,但有一个奇怪的问题:视图
.cshtml
中的硬编码 Unicode 字符串似乎无法正确呈现。下面是我的意思:
具有_Layout.cshtml
的:
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<p>Accents in \Views\_Layout.cshtml: à é ë ô</p>
@RenderBody()
</body>
</html>
和Articles.cshtml
:
@inherits ViewPage<List<PrepaService.Article>>
<p>Accents in \Views\Articles.cshtml: à é ë ô</p>
Table with code-injected list of items:
<table>
@foreach(var a in Model) {
<tr>
<td>@a.Description</td>
</tr>
}
</table>
两个文件都以无BOM的UTF8格式正确保存。
我也尝试添加以下内容,但并没有改变任何东西:
SetConfig(new EndpointHostConfig {
AppendUtf8CharsetOnContentTypes = new HashSet<string> { ContentType.Html }
});
总结一下:
我对所有文件使用无BOM的UTF8编码,并明确指定
charset=utf-8
内容类型定义。这适用于在
_Layout.cshtml
中呈现的任何内容,以及由视图模板内部的代码注入的任何内容。但是它不适用于视图模板中的硬编码字符串。
sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' *.cshtml
。它可以处理带或不带bom的文件。 - oligofren