C # HtmlEncode - ISO-8859-1 имена объектов против номеров - PullRequest
10 голосов
/ 31 января 2011

В соответствии со следующей таблицей для стандарта ISO-8859-1 , похоже, существует имя объекта и номер объекта, связанный с каждым зарезервированным символом HTML.

Так, например, для символа é:

Имя объекта: é

Номер объекта: é

Аналогично для символа >:

Имя объекта: >

Номер объекта: >

Для данной строки HttpUtility.HtmlEncode возвращаетHTML закодировал String, но я не могу понять, как это работает.Вот что я имею в виду:

Console.WriteLine(HtmlEncode("é>"));
//Outputs é>

Кажется, он использует номер объекта для символа é, но имя объекта для символа >.

Так же, как и HtmlEncodeметод действительно работает со стандартом ISO-8859-1?Если это так, есть ли причина, по которой он иногда использует имя объекта, а иногда - номер объекта?Что еще более важно, я могу заставить его надежно дать мне имя сущности?

РЕДАКТИРОВАТЬ: Спасибо за ответы, ребята.Я не могу декодировать строку, прежде чем выполнить поиск, хотя.Не вдаваясь в подробности, текст сохраняется в списке SharePoint, а «поиск» выполняется самим SharePoint (с использованием запроса CAML).В общем, я не могу.

Я пытаюсь придумать, как преобразовать номера сущностей в имена, есть ли в .NET функция, которая это делает?Или любая другая идея?

Ответы [ 5 ]

4 голосов
/ 31 января 2011

Вот как метод был реализован.Для некоторых известных символов он использует соответствующую сущность, а для всего остального он использует соответствующее шестнадцатеричное значение, и вы мало что можете сделать, чтобы изменить это поведение.Выдержка из реализации System.Net.WebUtility.HtmlEncode (как видно с отражателем):

...
if (ch <= '>')
{
    switch (ch)
    {
        case '&':
        {
            output.Write("&amp;");
            continue;
        }
        case '\'':
        {
            output.Write("&#39;");
            continue;
        }
        case '"':
        {
            output.Write("&quot;");
            continue;
        }
        case '<':
        {
            output.Write("&lt;");
            continue;
        }
        case '>':
        {
            output.Write("&gt;");
            continue;
        }
    }
    output.Write(ch);
    continue;
}
if ((ch >= '\x00a0') && (ch < 'Ā'))
{
    output.Write("&#");
    output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
    output.Write(';');
}
...

При этом вам не следует беспокоиться, так как этот метод всегда будет создавать действительный, безопасный и правильно закодированный HTML.

1 голос
/ 10 ноября 2011

Я сделал эту функцию, думаю, она поможет

        string BasHtmlEncode(string x)
        {
           StringBuilder sb = new StringBuilder();
           foreach (char c in x.ToCharArray())
               sb.Append(String.Format("&#{0};", Convert.ToInt16(c)));
           return(sb.ToString());
        }
1 голос
/ 31 января 2011

ISO-8859-1 не имеет отношения к кодированию символов HTML. Из Википедии:

Числовые ссылки всегда относятся к Кодовые точки Unicode, независимо от кодировка страницы.

Только для неопределенных кодовых точек Unicode часто используется ISO-8859-1:

Использование числовых ссылки, которые относятся к постоянно неопределенные символы и контроль символы запрещены, с исключение перевода строки, табуляции и символы возврата каретки. То есть, символы в шестнадцатеричном диапазоне 00–08, 0B – 0C, 0E – 1F, 7F и 80–9F не может использоваться в документе HTML, даже не по ссылке, поэтому "™", например, не допускается. Тем не мение, для обратной совместимости с ранними Авторы HTML и браузеры, которые игнорировали это ограничение, необработанные символы и числовые ссылки на символы в Диапазон 80–9F интерпретируется некоторыми браузеры как представляющие символы отображаются в байты 80–9F в кодировка Windows-1252.

Теперь, чтобы ответить на ваш вопрос: чтобы поиск работал лучше, вы должны действительно искать незашифрованный HTML (сначала удаляя теги HTML), используя незашифрованную строку поиска. Сопоставление закодированных строк приведет к неожиданным результатам, таким как совпадения на основе тегов или комментариев HTML, а также совпадения, отсутствующие из-за различий в HTML, которые невидимы в тексте.

1 голос
/ 31 января 2011

HtmlEncode - в соответствии со спецификацией. Стандарт ISO определяет как имя, так и номер для каждого объекта, а имя и номер эквивалентны. Следовательно, соответствующая реализация HtmlEncode может свободно кодировать все точки как числа, или все как имена, или некоторую смесь двух.

Я предлагаю вам подойти к вашей проблеме с другой стороны: позвоните HtmlDecode на целевой текст, а затем выполните поиск в декодированном тексте, используя необработанную строку.

0 голосов
/ 09 августа 2013

Я разработал следующий код, чтобы сохранить a-z, A-Z и 0-1 не закодированными, а остальные:

public static string Encode(string source)
{
    if (string.IsNullOrEmpty(source)) return string.Empty;

    var sb = new StringBuilder(source.Length);
    foreach (char c in source)
    {
        if (c >= 'a' && c <= 'z')
        {
            sb.Append(c);
        }
        else if (c >= 'A' && c <= 'Z')
        {
            sb.Append(c);
        }
        else if (c >= '0' && c <= '9')
        {
            sb.Append(c);
        }
        else
        {
            sb.AppendFormat("&#{0};",Convert.ToInt32(c));
        }
    }

    return sb.ToString();
}
...