几种 HtmlEncode 的区别

本文详细解释了多种HTML编码方法的区别,包括HttpUtility.HtmlEncode、Server.HtmlEncode等,并通过实例对比了它们与自定义编码方法的不同之处。

问题:

HttpUtility.HtmlDecode ,HttpUtility.HtmlEncode 与 Server.HtmlDecode ,Server.HtmlEncode 与 HttpServerUtility.HtmlDecode , HttpServerUtility.HtmlEncode 有什么区别?

他们与下面一般手工写的代码有什么不一样的?

public static string htmlencode(string str)  
 { 
        if (str == null || str == "") 
            return ""; 
        str = str.Replace(">", ">"); 
        str = str.Replace(" ", "<"); 
        str = str.Replace(" ", ""); 
        str = str.Replace("  ", " "); 
        str = str.Replace("\"", """); 
        str = str.Replace("\'", "'"); 
        str = str.Replace("\n", " 
"); return str; }

答案:

HtmlEncode: 将 Html 源文件中不允许出现的字符进行编码,通常是编码以下字符""、"&" 等。

HtmlDecode: 刚好跟 HtmlEncode 相关,解码出来原本的字符。

HttpServerUtility 实体类的 HtmlEncode 方法 是一种简便方式,用于在运行时从 ASP.NET Web 应用程序访问 System.Web.HttpUtility.HtmlEncode 方法。HttpServerUtility 实体类的 HtmlEncode 方法 在内部使用 System.Web.HttpUtility.HtmlEncode 对字符串进行编码。

Server.HtmlEncode 其实就是 System.Web.UI.Page 类封装的 HttpServerUtility 实体类的 HtmlEncode 方法; System.Web.UI.Page 类有这样的一个属性: public HttpServerUtility Server { get; }

所以我们可以认为:
Server.HtmlDecode = HttpServerUtility 实体类的 HtmlDecode 方法 = HttpUtility.HtmlDecode ;
Server.HtmlEncode = HttpServerUtility 实体类的 HtmlEncode 方法 = HttpUtility.HtmlEncode ;

他们只不过是为了调用方便,做了封装而已。

在 ASP 中, Server.HTMLEncode Method 过滤的字符描述如下:

如果字符串不是 DBCS 编码。这个方法将转换下面字符:

less-than character ( <
greater-than character (>)>
ampersand character (&)&
double-quote character (")"
Any ASCII code character whose code is greater-than or equal to 0x80<number>, where <number> is the ASCII character value.</number></number>

如果是 DBCS 编码

  • All extended characters are converted.
  • Any ASCII code character whose code is greater-than or equal to 0x80 is converted to <number>, where <number> is the ASCII character value. </number></number>
  • Half-width Katakana characters in the Japanese code page are not converted.

相关资料:

Server.HTMLEncode Method
http://msdn.microsoft.com/en-us/library/ms525347.aspx

在ASP.net 中情况也类似

下面是一个简单的替换测试代码,测试结果看之后的注释:

protected void Page_Load(object sender, EventArgs e)
{

    TestChar(""); // 小于号    替换   <
    TestChar(">"); // 大于号    替换   >
    TestChar("'"); // 单引号    替换   '
    TestChar(" "); // 半角英文空格    不做替换
    TestChar(" "); // 全角中文空格    不做替换
    TestChar("&"); // &    替换   &
    TestChar("\""); // 英文双引号    替换   "
    TestChar("\n"); // 回车    不做替换
    TestChar("\r"); // 回车    不做替换
    TestChar("\r\n"); // 回车    不做替换
}


public void TestChar(string t)
{
    Response.Write(Server.HtmlEncode(t));
    Response.Write("__");
    Response.Write(HttpUtility.HtmlEncode(t));
    Response.Write("
"); }

所以上面我们提到的常用替换方式还是非常有用的,他还处理了一些 HttpUtility.HtmlEncode 不支持的替换。

public static string htmlencode(string str)
{
    if (str == null || str == "")
        return "";
    str = str.Replace(">", ">");
    str = str.Replace(" ", "<");
    str = str.Replace(" ", "");       // HttpUtility.HtmlEncode( 并不支持这个替换
    str = str.Replace("  ", " ");     // HttpUtility.HtmlEncode( 并不支持这个替换
    str = str.Replace("\"", """);
    str = str.Replace("\'", "'");
    str = str.Replace("\n", " 
"); // HttpUtility.HtmlEncode( 并不支持这个替换 return str; }

我们使用 Reflector 查看 HttpUtility.HtmlEncode 的实现,我们就可以看到,它只考虑的五种情况,空格,回车是没有处理的:

使用 Reflector 查看 HttpUtility.HtmlEncode 实现代码其中最重要的代码如下:

public static unsafe void HtmlEncode(string value, TextWriter output)
{
    if (value != null)
    {
        if (output == null)
        {
            throw new ArgumentNullException("output");
        }
        int num = IndexOfHtmlEncodingChars(value, 0);
        if (num == -1)
        {
            output.Write(value);
        }
        else
        {
            int num2 = value.Length - num;
            fixed (char* str = ((char*) value))
            {
                char* chPtr = str;
                char* chPtr2 = chPtr;
                while (num-- > 0)
                {
                    chPtr2++;
                    output.Write(chPtr2[0]);
                }
                while (num2-- > 0)
                {
                    chPtr2++;
                    char ch = chPtr2[0];
                    if (ch ')
                    {
                        switch (ch)
                        {
                            case '&':
                            {
                                output.Write("&");
                                continue;
                            }
                            case '\'':
                            {
                                output.Write("'");
                                continue;
                            }
                            case '"':
                            {
                                output.Write(""");
                                continue;
                            }
                            case '<");
                                continue;
                            }
                            case '>':
                            {
                                output.Write(">");
                                continue;
                            }
                        }
                        output.Write(ch);
                        continue;
                    }
                    if ((ch >= '\x00a0') && (ch ");
                        output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
                        output.Write(';');
                    }
                    else
                    {
                        output.Write(ch);
                    }
                }
            }
        }
    }
} 

参考资料:

HttpUtility.HtmlDecode与Server.HtmlDecode区别
http://topic.youkuaiyun.com/u/20090220/11/110c8079-1632-418a-b43b-3ddb2f0a06e2.html

詳細解說幾個建置網站時常用的編碼方法
http://blog.miniasp.com/?tag=/htmlencode

用于 Silverlight 的 .NET Framework 类库HttpUtility.HtmlEncode 方法
http://msdn.microsoft.com/zh-cn/library/system.windows.browser.httputility.htmlencode(VS.95).aspx

HttpUtility.HtmlEncode() and HttpServerUtility.HtmlEncode() do not encode all non-ASCII characters
https://connect.microsoft.com/VisualStudio/feedback/details/102251/httputility-htmlencode-and-httpserverutility-htmlencode-do-not-encode-all-non-ascii-characters?wa=wsignin1.0

### 常见的编码格式种类 在计算机科学中,编码格式用于将字符转换为二进制数据以便存储和传输。以下是常见的编码格式及其特点: #### 1. ASCII (American Standard Code for Information Interchange) ASCII 是最早的编码标准之一,使用 7 位二进制数表示字符,总共可以表示 128 个字符,包括英文字母、数字和一些控制字符。ASCII 编码适用于英文字符集,但对于其他语言的支持有限[^1]。 #### 2. GB2312 和 GBK GB2312 是中国国家标准编码,扩展了 ASCII 的范围以支持简体中文字符。GBK 是 GB2312 的扩展版本,增加了对繁体中文和其他字符的支持。这些编码主要用于中文环境下的文本处理[^4]。 #### 3. Unicode Unicode 是一种国际编码标准,旨在统一所有语言的字符编码。它为每个字符分配一个唯一的编号,而考虑具体的存储方式。Unicode 的前 128 个字符与 ASCII 完全兼容[^4]。 #### 4. UTF-8 UTF-8 是 Unicode 的一种实现方式,使用可变长度的字节来表示字符。对于 ASCII 字符,UTF-8 使用单个字节;而对于其他语言的字符,则使用多字节表示。UTF-8 是目前最常用的编码格式之一,因为它能够高效地处理多种语言的文本数据,并且与 ASCII 兼容[^2]。 #### 5. UTF-16 和 UTF-32 UTF-16 和 UTF-32 是 Unicode 的另外两种实现方式。UTF-16 使用 2 或 4 个字节表示字符,而 UTF-32 则始终使用 4 个字节表示每个字符。这两种编码格式在某些特定场景下可能会被使用,但相较于 UTF-8,它们的使用频率较低[^3]。 #### 6. HTML 编码和 CSS 编码 HTML 编码和 CSS 编码是专门用于网页和样式表的编码格式。它们通过实体引用(如 `&` 表示 `&`)或十六进制/十进制数值(如 `\u00A9` 表示版权符号 ©)来表示特殊字符[^2]。 #### 7. JSON 编码 JSON 编码是一种轻量级的数据交换格式,通常使用 UTF-8 编码来表示字符串。JSON 支持转义字符(如 `\n` 表示换行)以及 Unicode 字符的表示(如 `\uXXXX`)。 ### 示例代码 以下是一个简单的 Python 程序,演示如何使用同的编码格式进行字符串编码和解码: ```python text = "你好,世界!" # 使用 UTF-8 编码 utf8_encoded = text.encode('utf-8') utf8_decoded = utf8_encoded.decode('utf-8') # 使用 GBK 编码 gbk_encoded = text.encode('gbk') gbk_decoded = gbk_encoded.decode('gbk') print(f"原始文本: {text}") print(f"UTF-8 编码: {utf8_encoded}, 解码: {utf8_decoded}") print(f"GBK 编码: {gbk_encoded}, 解码: {gbk_decoded}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值