C#HtmlEncode - ISO-8859-1实体名称与数字

时间:2011-01-31 17:22:49

标签: c# .net string encoding iso

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

例如,对于角色é

实体名称:é

实体编号:é

同样,对于角色>

实体名称:>

实体编号:>

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

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

似乎是使用é字符的实体编号,而是使用>字符的实体名称。

HtmlEncode方法是否真的适用于ISO-8859-1标准?如果确实如此,是否有理由说它有时使用实体名称而有时使用实体编号?更重要的是,我可以强制它可靠地给我实体名称吗?

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

我正在试图想出一种将实体数字转换为名称的方法,.NET中是否有一个函数可以做到这一点?还是其他任何想法?

5 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

  

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

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

  

使用数字   引用永久性的引用   未定义的字符和控件   字符是被禁止的   换行符,制表符和   回车符。那是,   十六进制范围内的字符   00-08,0B-0C,0E-1F,7F和80-9F   不能在HTML文档中使用,   甚至没有参考,所以“™”,   例如,不允许。然而,   为了向后兼容早期   忽略的HTML作者和浏览器   这个限制,原始字符和   数字字符引用   80-9F范围由一些人解释   浏览器代表   映射到字节80-9F的字符   Windows-1252编码。

现在回答您的问题:为了使搜索工作得最好,您应该使用未编码的搜索字符串搜索未编码的HTML(首先剥离HTML标记)。 匹配编码字符串将导致意外结果,例如基于HTML标记或注释的匹配,并且由于HTML中不同的文本中的差异而丢失匹配。

答案 3 :(得分: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());
        }

答案 4 :(得分:0)

我开发了以下代码来保持a-z,A-Z和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();
}