【问题标题】:Why the HtmlEncode doesn't encode this char?为什么 HtmlEncode 不对这个字符进行编码?
【发布时间】:2012-06-19 15:50:23
【问题描述】:

这是代码:

Response.Write("asd1 X : " + HttpUtility.HtmlEncode("×"));
Response.Write("asd2 X : " + HttpUtility.HtmlEncode("✖"));

第一个是:

asd1 X : × // OK, ENCODED AS HTML ENTITIES

第二个不,只是✖:

asd2 X : ✖

那是哪种字符?另外,如果我尝试here,结果是:

asd1 X : ×
asd2 X : ✖

什么?为什么会有这种差异?

【问题讨论】:

  • 字符是 UTF-8 还是 Windows 1251?
  • 嗯...但是实体可以是通用的,不管字符集,我错了吗?
  • 看起来像 Unicode 字符 2716
  • OUTPUT 可以是通用的,但是函数如何知道输入是 UTF-8 还是 Win-1251?
  • 这是一个正确的问题。事实上:我怎么知道呢?我从网站复制/粘贴...我认为它也会复制字符集...嗯...

标签: c# html encoding html-entities


【解决方案1】:

HttpUtility.HtmlEncode(string) 的 MSDN 页面中,您会发现以下评论:

它将从十进制 160 到 255(包括两者)的所有字符代码编码为其数字实体(例如  

× (×) 与我的计算机上的× / × 相同,因此会被编码,但由于✖ / ✖,因此不会。

您可以使用the overload of HtmlEncode,它根据所需的编码采用TextWriter

【讨论】:

  • 使用重载方法不会产生 HTML 实体。它只是输出大 X。使用 (TextWriter tw = new StreamWriter(@"c:\temp\test.txt")){HttpUtility.HtmlEncode("✖", tw);}
  • @RayCheng - 你为什么期待一个数字实体引用?为什么需要它?
  • 我认为 OP 的意图是尝试获取 HTML 实体。但是对于HttpUtility.HtmlEncode,由于限制,该特定字符是不可能的。所以重载的方法仍然没有提供想要的结果。
  • @RayCheng - 我也不希望这样。
【解决方案2】:

我最好的客人是并非所有字符串都有实体表示。 Heavy multiplication X 只是其中之一。

为了详细说明 Oded 的链接,HttpUtility.HtmlEncode 仅对 ISO 8859-1 (Latin-1) 中的字符进行编码。由于重乘 X 不在此范围内,因此该函数不处理它。

如果您尝试Microsoft.Security.Application.AntiXss.HtmlEncode("✖");,您将在✖ 中获得 HTML 实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多