Как «кодировать HTML» Em Dash в Visual Basic.NET - PullRequest
0 голосов
/ 08 января 2009

Я генерирую некоторый текст для показа на веб-сайте и использую HttpUtility.HtmlEncode , чтобы убедиться, что он будет выглядеть правильно. Однако этот метод, по-видимому, не кодирует Em Dash (его следует преобразовать в "& mdash;").

Я нашел решение, но уверен, что есть лучший способ сделать это - какая-нибудь библиотечная функция или что-то еще.

sWebsiteText = _
    "<![CDATA[" & _
    HttpUtility.HtmlEncode(sSomeText) & _
    "]]>"

'This is the bit which seems "hacky"'
sWebsiteText = _
    sWebsiteText.Replace(HttpUtility.HtmlDecode("&#8211;"), "&#8211;")

Так что мой вопрос - как бы вы реализовали "хакерскую" часть?

Большое спасибо,

RB.

Ответы [ 3 ]

3 голосов
/ 08 января 2009

Поскольку этот символ не является символом ASCII, как его кодировать?

Это не символ ASCII, но это символ Unicode, U + 2014. Если ваша страница выводится в формате UTF-8, что в наши дни и на самом деле должно быть, вам не нужно кодировать ее HTML, просто выведите символ напрямую.

Существуют ли другие персонажи, которые могут вызвать у меня проблемы.

Какие именно проблемы это вам дает? Если вы не можете вывести «-», вы, вероятно, не сможете вывести любой другой не-ASCII символ Unicode, а это тысячи.

Заменить "\ u2014" на "& # x2014;" если вам действительно нужно, но на самом деле с современными инструментами, поддерживающими Юникод, не должно быть необходимости заменять каждый не-ASCII символ Юникода на разметку.

0 голосов
/ 09 июня 2009

Ответ Бобинса дает решение того, что, по-видимому, является вашей главной задачей: заменить использование HtmlDecode более простым объявлением символа для замены.
Перепишите

sWebsiteText.Replace(HttpUtility.HtmlDecode("&#8211;"), "&#8211;")

как

sWebsiteText.Replace("\u2013", "&#x2013;")

('\ u2014' (декабрь 8212) - это тире, '\ u2013' (декабрь 8211) - это тире)
Для удобства чтения лучше использовать "& # x2013;" вместо "-", поскольку объявление .Net для символа ("\ u2013") тоже в шестнадцатеричном виде. Но, поскольку десятичная запись в html более распространена, я лично предпочел бы использовать «-».
Для повторного использования вам, вероятно, следует написать собственную функцию HtmlEncode, объявленную в пользовательской HttpUtility, чтобы иметь возможность вызывать ее из любого места на вашем сайте, не дублируя ее.
(Есть что-то вроде (извините, я написал это на C #, забывая, что ваши примеры были в VB):

/// <summary>
/// Supplies some custom processing to some HttpUtility functions.
/// </summary>
public static class CustomHttpUtility
{
    /// <summary>
    /// Html encodes a string.
    /// </summary>
    /// <param name="input">string to be encoded.</param>
    /// <returns>A html encoded string.</returns>
    public static string HtmlEncode(string input)
    {
        if (intput == null)
            return null;
        StringBuilder encodedString = new StringBuilder(
            HttpUtility.HtmlEncode(input));
        encodedString.Replace("\u2013", "&#x2013;");
        // add over missing replacements here, as for &#8212;
        encodedString.Replace("\u2014", "&#x2014;");
        //...

        return encodedString.ToString();
    }
}

Затем замените

sWebsiteText = _
    "<![CDATA[" & _
    HttpUtility.HtmlEncode(sSomeText) & _
    "]]>"
'This is the bit which seems "hacky"'
sWebsiteText = _
    sWebsiteText.Replace(HttpUtility.HtmlDecode("&#8211;"), "&#8211;")

С:

sWebsiteText = _
    "<![CDATA[" & _
    CustomHttpUtility.HtmlEncode(sSomeText) & _
    "]]>"

)

0 голосов
/ 08 января 2009

Взгляните на Список отдельно , как я предложил в HTML Apostrophe вопрос.

Em dash - обозначается &#8212;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...