我在数据库中有html编码的字符串,但许多字符实体不仅仅是标准的&
和<
。 “
和—
等实体。不幸的是,我们需要将这些数据提供给基于闪存的rss阅读器,而flash不会读取这些实体,但它们会读取等效的unicode(ex “
)。
使用.Net 4.0,是否有任何实用方法可以将html编码的字符串转换为使用unicode编码的字符实体?
这是我需要的更好的例子。 db有html字符串,如:<p>John & Sarah went to see $ldquo;Scream 4$rdquo;.</p>
,我需要在<description>
标记的rss / xml文档中输出:<p>John &#38; Sarah went to see &#8220;Scream 4&#8221;.</p>
我正在使用XmlTextWriter从数据库记录创建xml文档,类似于此示例代码http://www.dotnettutorials.com/tutorials/advanced/rss-feed-asp-net-csharp.aspx
因此,我需要将数据库中的html字符串中的所有字符实体替换为其unicode等效项,因为基于Flash的rss阅读器无法识别最常见的任何实体,如&
。
答案 0 :(得分:7)
我的第一个想法是,您的RSS阅读器能否接受实际角色?如果是这样,您可以使用HtmlDecode并直接将其提取。
如果确实需要将其转换为数字表示,则可以解析每个实体HtmlDecode
,然后将其转换为int
以获取基数为10的unicode值。然后将其重新插入字符串中。
修改强> 这里有一些代码来证明我的意思(它没有经过测试,但是可以了解这个想法):
string input = "Something with — or other character entities.";
StringBuilder output = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
{
if (input[i] == '&')
{
int startOfEntity = i; // just for easier reading
int endOfEntity = input.IndexOf(';', startOfEntity);
string entity = input.Substring(startOfEntity, endOfEntity - startOfEntity);
int unicodeNumber = (int)(HttpUtility.HtmlDecode(entity)[0]);
output.Append("&#" + unicodeNumber + ";");
i = endOfEntity; // continue parsing after the end of the entity
}
else
output.Append(input[i]);
}
我可能会在某处出现一个一个错误的错误,但它应该很接近。
答案 1 :(得分:4)
会HttpUtility.HtmlDecode为你工作吗?
我意识到它不会转换为unicode等效实体,而是将其转换为unicode。是否有特定原因需要unicode等效实体?
更新了编辑
string test = "<p>John & Sarah went to see “Scream 4”.</p>";
string decode = HttpUtility.HtmlDecode(test);
string encode = HttpUtility.HtmlEncode(decode);
StringBuilder builder = new StringBuilder();
foreach (char c in encode)
{
if ((int)c > 127)
{
builder.Append("&#");
builder.Append((int)c);
builder.Append(";");
}
else
{
builder.Append(c);
}
}
string result = builder.ToString();
答案 2 :(得分:1)
您可以从W3C下载相应HTML和/或XHTML DTD的本地副本。然后设置一个XmlResolver并使用它来展开文档中找到的任何实体。
您可以使用正则表达式来查找/扩展实体,但这对上下文一无所知(例如,不应扩展CDATA部分中的任何内容)。
答案 3 :(得分:0)
这可能会帮助您将输入路径放在文本框中
try
{
FileInfo n = new FileInfo(textBox1.Text);
string initContent = File.ReadAllText(textBox1.Text);
int contentLength = initContent.Length;
Match m;
while ((m = Regex.Match(initContent, "[^a-zA-Z0-9<>/\\s(&#\\d+;)-]")).Value != String.Empty)
initContent = initContent.Remove(m.Index, 1).Insert(m.Index, string.Format("&#{0};", (int)m.Value[0]));
File.WriteAllText("outputpath", initContent);
}
catch (System.Exception excep)
{
MessageBox.Show(excep.Message);
}
}