根据table标准的以下ISO-8859-1,似乎有一个实体名称和一个与每个保留HTML字符关联的实体编号。
例如,对于角色é
:
实体名称:é
实体编号:é
同样,对于角色>
:
实体名称:>
实体编号:>
对于给定的字符串,HttpUtility.HtmlEncode
返回一个HTML编码的字符串,但我无法弄清楚它是如何工作的。这就是我的意思:
Console.WriteLine(HtmlEncode("é>"));
//Outputs é>
似乎是使用é
字符的实体编号,而是使用>
字符的实体名称。
HtmlEncode方法是否真的适用于ISO-8859-1标准?如果确实如此,是否有理由说它有时使用实体名称而有时使用实体编号?更重要的是,我可以强制它可靠地给我实体名称吗?
编辑: 谢谢你的回答。我执行搜索之前无法解码字符串。在没有太多细节的情况下,文本存储在SharePoint列表中,“搜索”由SharePoint本身完成(使用CAML查询)。所以基本上,我不能。
我正在试图想出一种将实体数字转换为名称的方法,.NET中是否有一个函数可以做到这一点?还是其他任何想法?
答案 0 :(得分:4)
这就是该方法的实施方式。对于某些已知字符,它使用相应的实体,而对于其他所有字符,它使用相应的十六进制值,并且您无法修改此行为。摘录自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。
答案 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();
}