如何在Visual Basic.NET中“HTML编码”Em Dash

时间:2009-01-08 10:48:59

标签: html vb.net encoding

我正在生成一些要在网站上显示的文字,并使用HttpUtility.HtmlEncode确保它看起来正确。但是,此方法似乎不编码Em Dash(它应将其转换为“ - ”)。

我已经提出了一个解决方案,但我确信有更好的方法 - 一些库函数或其他东西。

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

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

所以我的问题是 - 你将如何实施“hacky”部分?

非常感谢,

RB。

3 个答案:

答案 0 :(得分:3)

  

由于此字符不是ASCII字符,我该如何对其进行编码?

它不是ASCII字符,但它是一个Unicode字符,U + 2014。如果您的页面输出将是UTF-8,在这个时代,它确实应该是,您不需要对其进行HTML编码,只需直接输出该字符。

  

是否有其他角色可能会给我带来麻烦。

它给你带来了什么问题?如果你不能输出' - ',你可能无法输出任何其他非ASCII Unicode字符,其中有数千个字符。

将“\ u2014”替换为“&amp;#x2014;”如果你真的必须,但真的使用今天的Unicode感知工具,就不需要用标记来替换每个非ASCII Unicode字符。

答案 1 :(得分:0)

按照A List Apart问题中的建议,查看HTML Apostrophe

em破折号 - 由&#8212;表示。

答案 2 :(得分:0)

Bobince的回答为您的主要关注提供了一个解决方案:通过更直接的char替换来替换您对HtmlDecode的使用。
重写

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


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

('\ u2014'(dec 8212)是破折号,'\ u2013'(dec 8211)是破折号。)

出于可读性目的,使用“&amp;#x2013;”可能会更好。而不是“&amp;#8211;”,因为char(“\ u2013”​​)的.Net声明也是十六进制。但是,由于十进制符号似乎在html中更常见,我个人更喜欢使用“&amp;#8211;”。 出于重用目的,您可能应该编写自己的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) & _
    "]]>"