将字符实体转换为其unicode等效项

时间:2011-04-25 22:08:00

标签: c# .net html character-encoding

我在数据库中有html编码的字符串,但许多字符实体不仅仅是标准的&<“—等实体。不幸的是,我们需要将这些数据提供给基于闪存的rss阅读器,而flash不会读取这些实体,但它们会读取等效的unicode(ex “)。

使用.Net 4.0,是否有任何实用方法可以将html编码的字符串转换为使用unicode编码的字符实体?

这是我需要的更好的例子。 db有html字符串,如:<p>John &amp; Sarah went to see $ldquo;Scream 4$rdquo;.</p>,我需要在<description>标记的rss / xml文档中输出:&lt;p&gt;John &amp;#38; Sarah went to see &amp;#8220;Scream 4&amp;#8221;.&lt;/p&gt;

我正在使用XmlTextWriter从数据库记录创建xml文档,类似于此示例代码http://www.dotnettutorials.com/tutorials/advanced/rss-feed-asp-net-csharp.aspx

因此,我需要将数据库中的html字符串中的所有字符实体替换为其unicode等效项,因为基于Flash的rss阅读器无法识别最常见的任何实体,如&amp;

4 个答案:

答案 0 :(得分:7)

我的第一个想法是,您的RSS阅读器能否接受实际角色?如果是这样,您可以使用HtmlDecode并直接将其提取。

如果确实需要将其转换为数字表示,则可以解析每个实体HtmlDecode,然后将其转换为int以获取基数为10的unicode值。然后将其重新插入字符串中。

修改 这里有一些代码来证明我的意思(它没有经过测试,但是可以了解这个想法):

string input = "Something with &mdash; 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 &amp; Sarah went to see &ldquo;Scream 4&rdquo;.</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);

        }



    }