【问题标题】:How to decode Feedburner result containing \x3c and so on如何解码包含 \x3c 等的 Feedburner 结果
【发布时间】:2010-12-15 20:30:08
【问题描述】:

Feed Burner 更改了他们的博客服务返回结果,它返回的 javascript 块类似于:

document.write("\x3cdiv 类\x3d\x22feedburnerFeedBlock\x22 id\x3d\x22RitterInsuranceMarketingRSSv3iugf6igask14fl8ok645b6l0\x22\x3e"); document.write("\x3cul\x3e"); document.write("\x3cli\x3e\x3cspan 类\x3d\x22headline\x22\x3e\x3ca href\x3d\x22

我想要原始的 html。以前我可以轻松地使用 .Replace 来删除 document.write 语法,但我不知道这是什么类型的编码,或者至少不知道如何用 C# 对其进行解码。

编辑:好吧,这是一个最终解决的半噩梦,这就是我想出的,以防万一有人可以提供任何改进

public static  char ConvertHexToASCII(this string hex)
{
    if (hex == null) throw new ArgumentNullException(hex);
    return (char)Convert.ToByte(hex, 16);
}

.

private string DecodeFeedburnerHtml(string html)
{
    var builder = new StringBuilder(html.Length);
    var stack = new Stack<char>(4);
    foreach (var chr in html)
    {
        switch (chr)
        {
            case '\\':
                if (stack.Count == 0)
                {
                    stack.Push(chr);
                }
                else
                {
                    stack.Clear();
                    builder.Append(chr);
                }
                break;
            case 'x':
                if (stack.Count == 1)
                {
                    stack.Push(chr);
                }
                else
                {
                    stack.Clear();
                    builder.Append(chr);
                }
                break;
            default:
                if (stack.Count >= 2)
                {
                    stack.Push(chr);

                    if (stack.Count == 4)
                    {
                        //get stack[3]stack[4]
                        string hexString = string.Format("{1}{0}", stack.Pop(),
                                                     stack.Pop());

                        builder.Append(hexString.ConvertHexToASCII());
                        stack.Clear();
                    }
                }
                else
                {
                    builder.Append(chr);
                }
                break;
        }
    }

    html = builder.ToString();
    return html;
}

不知道我还能做得更好。出于某种原因,这样的代码对我来说总是感觉很脏,即使它是一个线性时间算法,我想这与它必须有多长时间有关。

【问题讨论】:

    标签: c# encoding character-encoding decode feedburner


    【解决方案1】:

    在 dotnet 核心中,您可以使用 Uri.UnescapeDataString(originalString.Replace("\x","%")) 首先将其转换为 Url 编码的字符串。

    【讨论】:

      【解决方案2】:

      这些看起来像 ASCII 值,以十六进制编码。您可以遍历字符串,并且每当您找到一个\x 后跟两个十六进制数字(0-9,a-f)时,将其替换为相应的 ASCII 字符。如果字符串很长,将结果增量保存到StringBuilder 而不是使用String.Replace() 会更快。

      我不知道编码规范,但可能需要遵循更多规则(例如,如果 \\ 是文字 \ 的转义字符)。

      【讨论】:

        【解决方案3】:

        那是 PHP Twig 编码:

        http://www.twig-project.org/

        由于您使用的是 C#,因此您很可能必须创建一个字典来翻译符号,然后使用一系列 .Replace() 字符串方法将它们转换回 HTML 字符。

        或者,您可以将该数据保存到文件中,运行 Perl 脚本来解码文本,然后用 C# 从文件中读取,但这可能会更昂贵。

        【讨论】:

        • 听着真是令人沮丧
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多