Как декодировать результат Feedburner, содержащий \ x3c и т. Д. - PullRequest
0 голосов
/ 15 декабря 2010

Feed Burner изменил свои результаты службы блогов, что возвращает блоки javascript, подобные:

document.write ( "\ x3cdiv класс \ x3d \ x22feedburnerFeedBlock \ x22 идентификатор \ 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;
}

Не уверен, что еще я мог бы сделать лучше. По какой-то причине такой код всегда кажется мне очень грязным, хотя это алгоритм с линейным временем, и я думаю, это связано с тем, как долго это должно быть.

Ответы [ 3 ]

2 голосов
/ 18 марта 2018

В ядре dotnet вы можете использовать Uri.UnescapeDataString (originalString.Replace ("\ x", "%")), чтобы преобразовать его, превратив сначала в строку в кодировке Url.

1 голос
/ 15 декабря 2010

Они выглядят как значения ASCII, закодированные в шестнадцатеричном формате.Вы можете пройти строку и всякий раз, когда вы найдете \x, за которым следуют две шестнадцатеричные цифры (0-9, af), замените его соответствующим символом ASCII.Если строка длинная, было бы быстрее сохранить результат постепенно в StringBuilder вместо использования String.Replace().

Я не знаю спецификацию кодировки, но могут быть и другие правила (например, если \\ является escape-символом для литерала \).

1 голос
/ 15 декабря 2010

Это кодировка PHP Twig:

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

Поскольку вы используете C #, вам, скорее всего, придется создать словарьчтобы перевести символы, а затем использовать серию .Replace() строковых методов для преобразования этих символов обратно в символы HTML.

В качестве альтернативы вы можете сохранить эти данные в файл, запустить скрипт Perl для декодирования текста и затем прочитатьиз файла в C #, но это может быть дороже.

...