根据下面的表格标准,似乎有一个实体名和一个实体号与每个保留的ISO-8859-1字符相关联。
例如,对于字符é
:
实体名称:é
实体号:é
同样,对于字符>
:
实体名称:>
实体号:>
对于给定的字符串,HttpUtility.HtmlEncode
返回一个HTML编码的字符串,但我不知道它是如何工作的。我的意思是:
Console.WriteLine(HtmlEncode("é>"));
//Outputs é>
它似乎对é
字符使用了实体号,而对>
字符使用了实体名。
那么,HtmlEncode方法真的适用于ISO8859-1标准吗?如果有的话,它为什么有时使用实体名而其他时候使用实体号呢?更重要的是,我能强迫它可靠地给我实体名称吗?
编辑:谢谢大家的回答。不过,在执行搜索之前,我无法解码字符串。在不涉及太多细节的情况下,文本存储在SharePoint列表中,“搜索”由SharePoint自己完成(使用CAML查询)。所以基本上我做不到。
我试图想出一种将实体编号转换为名称的方法,在.NET中有这样的函数吗?或者其他的想法?
发布于 2011-01-31 09:27:37
这就是实现该方法的方法。对于一些已知的字符,它使用相应的实体,而对于其他的所有字符,它都使用相应的十六进制值,并且您无法做太多的事情来修改这种行为。System.Net.WebUtility.HtmlEncode
实现的摘录(如反射器所示):
...
if (ch <= '>')
{
switch (ch)
{
case '&':
{
output.Write("&");
continue;
}
case '\'':
{
output.Write("'");
continue;
}
case '"':
{
output.Write(""");
continue;
}
case '<':
{
output.Write("<");
continue;
}
case '>':
{
output.Write(">");
continue;
}
}
output.Write(ch);
continue;
}
if ((ch >= '\x00a0') && (ch < 'Ā'))
{
output.Write("&#");
output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
output.Write(';');
}
...
这是说,您不应该关心,因为这个方法将始终产生有效,安全和正确编码的HTML。
发布于 2011-01-31 09:28:20
HtmlEncode
正在遵循规范。ISO标准为每个实体指定了一个名称和一个数字,并且名称和数字是等价的。因此,HtmlEncode
的一致性实现可以自由地将所有点编码为数字,或全部编码为名称,或将两者混合在一起。
我建议您从另一个方向着手解决问题:对目标文本调用HtmlDecode
,然后使用原始字符串搜索解码后的文本。
发布于 2011-01-31 09:52:44
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中的差异而丢失的命中。
https://stackoverflow.com/questions/4853920
复制