11

根据ISO-8859-1标准的下,每个保留的 HTML 字符似乎都有一个实体名称和一个实体编号。

例如,对于字符é

实体名称 :é

实体编号:é

同样,对于字符>

实体名称 :>

实体编号:>

对于给定的字符串,HttpUtility.HtmlEncode返回一个 HTML 编码的字符串,但我不知道它是如何工作的。这就是我的意思:

Console.WriteLine(HtmlEncode("é>"));
//Outputs é>

它似乎使用角色的实体编号,但é角色的实体名称>

那么 HtmlEncode 方法真的适用于 ISO-8859-1 标准吗?如果是这样,它有时使用实体名称而有时使用实体编号是否有原因?更重要的是,我可以强制它可靠地给我实体名称吗?

编辑: 谢谢你们的回答。我无法在执行搜索之前解码字符串。在不涉及太多细节的情况下,文本存储在 SharePoint 列表中,“搜索​​”由 SharePoint 本身完成(使用 CAML 查询)。所以基本上,我不能。

我正在尝试将实体编号转换为名称的方法,.NET 中是否有这样做的功能?还是有其他想法?

4

5 回答 5

4

这就是该方法的实现方式。对于某些已知字符,它使用相应的实体,而对于其他所有字符,它使用相应的十六进制值,您无法修改此行为。摘自System.Net.WebUtility.HtmlEncode(如反射器所示)的实现:

...
if (ch <= '>')
{
    switch (ch)
    {
        case '&':
        {
            output.Write("&amp;");
            continue;
        }
        case '\'':
        {
            output.Write("&#39;");
            continue;
        }
        case '"':
        {
            output.Write("&quot;");
            continue;
        }
        case '<':
        {
            output.Write("&lt;");
            continue;
        }
        case '>':
        {
            output.Write("&gt;");
            continue;
        }
    }
    output.Write(ch);
    continue;
}
if ((ch >= '\x00a0') && (ch < 'Ā'))
{
    output.Write("&#");
    output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
    output.Write(';');
}
...

话虽如此,您不必在意,因为此方法将始终生成有效、安全且正确编码的 HTML。

于 2011-01-31T17:27:37.617 回答
1

HtmlEncode 遵循规范ISO 标准为每个实体指定了名称和编号,名称和编号是等价的。因此,符合的实现HtmlEncode可以自由地将所有点编码为数字,或全部编码为名称,或两者的某种混合。

我建议您从另一个方向解决您的问题:调用HtmlDecode目标文本,然后使用原始字符串搜索解码的文本。

于 2011-01-31T17:28:20.827 回答
1

ISO-8859-1 与 HTML 字符编码并不真正相关。来自维基百科:

无论页面的编码如何,数字引用始终引用 Unicode 代码点。

仅对于未定义的 Unicode 代码点,经常使用 ISO-8859-1:

禁止使用引用永久未定义字符和控制字符的数字引用,但换行符、制表符和回车符除外。也就是说,十六进制范围 00–08、0B–0C、0E–1F、7F 和 80–9F 中的字符不能在 HTML 文档中使用,甚至不能通过引用使用,因此不允许使用例如“™” . 但是,为了与忽略此限制的早期 HTML 作者和浏览器向后兼容,某些浏览器将 80-9F 范围内的原始字符和数字字符引用解释为表示映射到 Windows-1252 编码中字节 80-9F 的字符。

现在回答您的问题:为了使搜索发挥最佳效果,您应该使用未编码的搜索字符串真正搜索未编码的 HTML(首先剥离 HTML 标签)。匹配编码字符串将导致意外结果,例如基于 HTML 标记或注释的命中,以及由于文本中不可见的 HTML 差异而丢失的命中。

于 2011-01-31T17:52:44.423 回答
1

我做了这个功能,我认为它会有所帮助

        string BasHtmlEncode(string x)
        {
           StringBuilder sb = new StringBuilder();
           foreach (char c in x.ToCharArray())
               sb.Append(String.Format("&#{0};", Convert.ToInt16(c)));
           return(sb.ToString());
        }
于 2011-11-10T16:04:36.500 回答
0

我开发了以下代码来保持 az、AZ 和 0-1 不编码但休息:

public static string Encode(string source)
{
    if (string.IsNullOrEmpty(source)) return string.Empty;

    var sb = new StringBuilder(source.Length);
    foreach (char c in source)
    {
        if (c >= 'a' && c <= 'z')
        {
            sb.Append(c);
        }
        else if (c >= 'A' && c <= 'Z')
        {
            sb.Append(c);
        }
        else if (c >= '0' && c <= '9')
        {
            sb.Append(c);
        }
        else
        {
            sb.AppendFormat("&#{0};",Convert.ToInt32(c));
        }
    }

    return sb.ToString();
}
于 2013-08-09T17:08:22.963 回答