【问题标题】:Easy way to convert &#XXXX; from HTML to UTF-8 xml either programmaticaly in .Net or using tools转换 &#XXXX; 的简单方法在 .Net 中以编程方式或使用工具从 HTML 到 UTF-8 xml
【发布时间】:2011-03-24 12:24:48
【问题描述】:

HTML 和 XML 并不相同,只是为了说明。

用于输入 HTML 文件

<p class=MsoNormal style='tab-stops:.5in'><b><span style='mso-tab-count:3'>                                    </span></b><b><span
lang=AR-SY dir=RTL style='mso-bidi-language:AR-SY'>&#1593;&#1586;&#1578;
&#1575;&#1576;&#1585;&#1575;&#1607;&#1610;&#1605;
&#1575;&#1604;&#1583;&#1608;&#1585;&#1610;</span><o:p></o:p></b></p>

使用 UTF-8 编码接收 XML

<Name Type="Script"> صدام حسين التكريتي</Name>

基本上我需要一个序列 ASCII 序列 xxx;yyyy;zzzz;保存为 utf-8。

【问题讨论】:

    标签: .net html xml utf-8


    【解决方案1】:

    我不太确定您是想将 HTML 十进制编码转换到位还是从 HTML 转换为 XML 文档。将十进制(或十六进制)编码字符转换为 UTF-8/16 并不太难。然而,在野外正确解析 HTML 可能是一个挑战(参见 thread)。

    这是一个简单的类,用于将十进制和十六进制编码字符转换到位并返回一个 .Net 字符串(我不保证它的正确性或鲁棒性 - 特别是如果您试图将它用于格式错误的 HTML 或具有代理对字符):

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Text.RegularExpressions;
    
    namespace HtmlEncodingConverter
    {
        internal static class HtmlEncoding
        {
        private static readonly Regex EncodedCharRegex = new Regex(@"&#[X]?[0-9|A-F]{1,12};",
                                                                   RegexOptions.Compiled |
                                                                   RegexOptions.IgnoreCase |
                                                                   RegexOptions.CultureInvariant);
    
    
        public static string ToUtfCharacters(string input)
        {
            return ConvertInnerText(input, ReplaceWithCharacter);
        }
    
        private static string ReplaceWithCharacter(string original)
        {
            return EncodedCharRegex.Replace(original, new MatchEvaluator(DecodeCharacter));
        }
    
        private static string DecodeCharacter(Match match)
        {
            string digits = match.ToString().TrimStart(new[] {'#', '&'}).TrimEnd(';').ToUpperInvariant();
            return digits.StartsWith("X") ? HexToString(digits) : DecToString(digits);
        }
    
        private static string DecToString(string digits)
        {
            return ((char) int.Parse(digits)).ToString();
        }
    
        private static string HexToString(string digits)
        {
            return ((char) int.Parse(
                digits.Substring(1), 
                NumberStyles.HexNumber, 
                CultureInfo.InvariantCulture)).ToString();
        }
    
        private static string ConvertInnerText(string original, Func<string, string> converter)
        {
            var convertedQueue = new Queue<char>(original.Length);
            var innerQueue = new Queue<char>();
            int tagCount = 0;
            bool hasFoundHtml = false;
            foreach (char character in original)
            {
                if (character.Equals('<'))
                {
                    hasFoundHtml = true;
                    if (tagCount == 0 && innerQueue.Count > 0)
                    {
                        var innerString = new string(innerQueue.ToArray());
                        string convertedString = converter.Invoke(innerString);
                        foreach (char convertedCharacter in convertedString)
                        {
                            convertedQueue.Enqueue(convertedCharacter);
                        }
                        innerQueue.Clear();
                    }
                    tagCount += 1;
                    convertedQueue.Enqueue(character);
                    continue;
                }
                if (character.Equals('>'))
                {
                    tagCount -= 1;
                    convertedQueue.Enqueue(character);
                    continue;
                }
                if (tagCount == 0 && hasFoundHtml)
                {
                    innerQueue.Enqueue(character);
                }
                else
                {
                    convertedQueue.Enqueue(character);
                }
            }
            return new string(convertedQueue.ToArray());
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 2017-02-13
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多