天天看點

對HtmlEncode的增強——HtmlEntitiesEncode

工作中我們常常需要加殼(escape)後傳輸或儲存HTML文本,UI層使用時再進行脫殼(unescape)。

很慶幸.net為我們提供了非常好用的HttpUtility類,加殼時可采用HtmlEncode方法,脫殼時采用HtmlDecode。

但實際使用這兩個方法時,即可知道HtmlDecode很好很實用;HtmlEncode卻顯得先天不足,僅能轉換很少的一些html标記(如:<),

中文、全角符号或大量的特殊字元根本沒有進行轉換。是以在傳輸或儲存入庫時總會遇到這樣那樣的問題。

解決這一問題的方法其實很簡單,每一個可敲出的字元總是對應了一個Unicode編碼,而編碼又對應了一個32位的整形數字,

那麼使用 {數字}; 的形式就可以轉換文本,即HtmlEntities。

轉換的函數:

 1

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

    /**//// <summary>

 2

對HtmlEncode的增強——HtmlEntitiesEncode

    /// HTMLEntitiesEncode(HTMLEntities編碼)

 3

對HtmlEncode的增強——HtmlEntitiesEncode

    /// </summary>

 4

對HtmlEncode的增強——HtmlEntitiesEncode

    /// <param name="text">需要轉換的html文本</param>

 5

對HtmlEncode的增強——HtmlEntitiesEncode

    /// <returns>HTMLEntities編碼後的文本</returns>

 6

對HtmlEncode的增強——HtmlEntitiesEncode

    public static string HtmlEntitiesEncode(string text)

 7

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

{

 8

對HtmlEncode的增強——HtmlEntitiesEncode

        // 擷取文本字元數組

 9

對HtmlEncode的增強——HtmlEntitiesEncode

        char[] chars = HttpUtility.HtmlEncode(text).ToCharArray();

10

對HtmlEncode的增強——HtmlEntitiesEncode

11

對HtmlEncode的增強——HtmlEntitiesEncode

        // 初始化輸出結果

12

對HtmlEncode的增強——HtmlEntitiesEncode

        StringBuilder result = new StringBuilder(text.Length + (int)(text.Length * 0.1));

13

對HtmlEncode的增強——HtmlEntitiesEncode

14

對HtmlEncode的增強——HtmlEntitiesEncode

        foreach (char c in chars)

15

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

16

對HtmlEncode的增強——HtmlEntitiesEncode

            // 将指定的 Unicode 字元的值轉換為等效的 32 位有符号整數

17

對HtmlEncode的增強——HtmlEntitiesEncode

            int value = Convert.ToInt32(c);

18

對HtmlEncode的增強——HtmlEntitiesEncode

19

對HtmlEncode的增強——HtmlEntitiesEncode

            // 内碼為127以下的字元為标準ASCII編碼,不需要轉換,否則做 {數字}; 方式轉換

20

對HtmlEncode的增強——HtmlEntitiesEncode

            if (value > 127)

21

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

22

對HtmlEncode的增強——HtmlEntitiesEncode

                result.AppendFormat("{0};", value);

23

對HtmlEncode的增強——HtmlEntitiesEncode

            }

24

對HtmlEncode的增強——HtmlEntitiesEncode

            else

25

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

26

對HtmlEncode的增強——HtmlEntitiesEncode

                result.Append(c);

27

對HtmlEncode的增強——HtmlEntitiesEncode

28

對HtmlEncode的增強——HtmlEntitiesEncode

        }

29

對HtmlEncode的增強——HtmlEntitiesEncode

30

對HtmlEncode的增強——HtmlEntitiesEncode

        return result.ToString();

31

對HtmlEncode的增強——HtmlEntitiesEncode

    }

(使用時記得引入 using System.Text)

測試代碼:

對HtmlEncode的增強——HtmlEntitiesEncode

    protected void Button3_Click(object sender, EventArgs e)

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

        // 正常HtmlEncode編碼

對HtmlEncode的增強——HtmlEntitiesEncode

        string strHtmlEncode = HttpUtility.HtmlEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

        // 增強的HtmlEntities編碼

對HtmlEncode的增強——HtmlEntitiesEncode

        string strHtmlEntitiesEncode = HtmlEntitiesEncode("<tr><td>《sss123┏你好啊┓123®はい》</td></tr>");

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

        string strHtmlDecode1 = HttpUtility.HtmlDecode(strHtmlEncode);

對HtmlEncode的增強——HtmlEntitiesEncode
對HtmlEncode的增強——HtmlEntitiesEncode

        string strHtmlDecode2 = HttpUtility.HtmlDecode(strHtmlEntitiesEncode);

對HtmlEncode的增強——HtmlEntitiesEncode

運作時監視截圖:

可以很清楚的看到增強的HtmlEncode方法較完美地轉換了中文或一些特殊字元,而且HtmlDecode的結果都是一樣的。

繼續閱讀