C# html输出中的特殊字符

C# html输出中的特殊字符,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我希望像“ø”这样的字符可以直接打印,但在源代码中,“ø”显示为ø 如果输出通过Html.Encode()将不会呈现正确的字符,而是ø 在我的配置中 <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" culture="nb-NO" uiCulture="nb-NO" /> 资料来源: <li><%: Htm

我希望像“ø”这样的字符可以直接打印,但在源代码中,“ø”显示为
ø

如果输出通过
Html.Encode()
将不会呈现正确的字符,而是
ø

在我的配置中

<globalization
  fileEncoding="utf-8"
  requestEncoding="utf-8"
  responseEncoding="utf-8"
  culture="nb-NO"
  uiCulture="nb-NO"
/>

资料来源:

<li><%: Html.ActionLink("Støvletter", "ListProducts", "Tag", new { tag = "Stovletter" }, null)%></li>
  • 这将产生:

    <li><a href="/Tag/Stovletter">St&#248;vletter</a></li>
    
  • 但输出应该如下所示:

    <li><a href="/Tag/Stovletter">Støvletter</a></li>
    

  • AFAIK这是不可能的,除非您使用自己的自定义HTML编码例程(我绝对建议您不要这样做)

    生成的HTML是正确的,并且字符正确显示在客户端浏览器上。HTML意味着由程序(web浏览器)读取,以便将其呈现为人类可读的形式,而不是人类

    <li><a href="/Tag/Stovletter">St&#248;vletter</a></li>
    
  • 是一个完全有效的HTML,将在客户端浏览器上显示如下:


    您可以尝试使用
    创建输出这可能不是您要寻找的答案,但它仍然很有趣

    如果您查看
    HttpEncoder
    源代码,它为使用
    htmlencoder
    而不是默认代码做了准备

    我已经玩过了,发现来自微软的代码正确地编码了这些字符

    我使用以下方式安装它:

    然后更新我的
    web.config
    ,如下所示:

    <system.web>
        <httpRuntime encoderType="Microsoft.Security.Application.AntiXssEncoder, 
    AntiXssLibrary" />
        ....
    </system.web>
    
    
    ....
    

    正常输出和Html.ActionLinks似乎都能正常工作。

    这种情况下的“源”是什么?您需要提供更多的上下文。我用源代码和输出进行了更新。@DarinDimitrov:因为如果我通过Html.Encode()运行字符串,它会以“ø;”的字面形式呈现给用户。您是否尝试过直接输出
    @WiktorZychla,而这不会改变任何内容,因为它是执行编码的
    Html.ActionLink
    方法,它输出一个
    MvcHtmlString
    ,该字符串不会被再次编码。在html/xml中没有特殊意义的实体编码字符在我看来非常愚蠢。这就是为什么我们有UTF8。这当然是正确的,但我觉得很难看。而且我觉得人类可读性是html的一个特点。否则我们就可以使用二进制格式,这种格式更紧凑,也更容易解析。@CodeInChaos,用户代理并不像我们人类那样真正具有
    丑陋的概念:-)他们理解标记有效性的概念。就二进制格式而言,这正是您应该在生产中对站点执行的操作=>删除所有空白,gzip等等。你最近看过HTML源代码吗?当我看google HTML时,我肯定看到他们没有在更高的unicode代码点上使用实体编码。我意识到这对最终用户是正确的,但我希望发送给用户的HTML文件是UTF-8(从技术上讲是UTF-8,但我也希望它不编码特殊字符).我很难想出一个正确的选择。我宁愿使用
    IHtmlString
    HtmlString
    MvcHtmlString
    。我选择这作为接受的答案,因为它解决了我在除使用Html以外的所有地方的问题。ActionLink()我在他们的存储库中找不到正确的源代码文件。你能发布链接吗?我找到的函数的调用方式不同,而且默认情况下对所有不在小白名单上的字符进行编码。@CodeInChaos,我使用Resharper从Microsoft服务器自动下载代码。下面是我正在查看的
    WebUtility.Encode
    中的代码片段:,请参见第74-81行。øoridinal值248,因此编码。对于此行为,必须使用
    ENTITY\u ENCODE\u HIGH\u ASCII\u CHARS
    编译器指令编译代码。
    <system.web>
        <httpRuntime encoderType="Microsoft.Security.Application.AntiXssEncoder, 
    AntiXssLibrary" />
        ....
    </system.web>