2009年12月19日

StringEscapeUtils.escapeHtml、unescapeHtml:處理html中的編碼問題


 
先前在幾篇文章中提到了網址編碼和文字轉碼的問題,
如 Javascript 就有以下 1, 2兩篇, Java 部份則是第3篇:
  1. 用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
  2. Online UrlEncoder:線上轉換中文網址為UTF-8編碼
  3. 用Java替中文轉碼:URLEncoder
然而最近使用 Java 處理網頁資料時卻遇上了一個問題,
即從網頁原始碼得到的資料會有類似下面這種編碼。
&<>"
這在我們一看就知道是為了在 html 正確顯示的code,
然而如果不是熟悉 html 的人會以為是亂碼,
而且就算我們知道是 html 的 code,
平常不使用的話也不容易知道到底哪個碼對應哪個字。
因此今天就是要介紹在 Java 中能將 html 編碼正確轉換的套件,
org.apache.commons.lang.StringEscapeUtils
另外若想知道在 java中如何處理 xss 的攻擊可見:
HTML Purifier in Java:HTMLInputFilter

StringEscapeUtils有許多好用的功能,之後有用到的話會再來介紹,
今天主要先介紹:escapeHtml unescapeHtml
更多的功能可見 StringEscapeUtils 的 API

要使用 StringEscapeUtils 要先到這個網址去下載相關的 jar 檔並匯入,
http://commons.apache.org/downloads/download_lang.cgi
接著便可以依下面的程式碼測試是否可以正確 escape 和 unescape html了。
程式中共有兩個測試,一個測試純文字的轉換,另一個則是針對上面所提的奇怪符號作測試:
  1. package demo.stringEscapeUtils;

  2. import org.apache.commons.lang.StringEscapeUtils;

  3. public class StringEscapeUtilsDemo {

  4. public static void main(String[] args) {

  5. // 測試純文字的 escape 和 unescape
  6. String normalWords = "測試文字";
  7. System.out.println("測試純文字的 escape 和 unescape");
  8. String escapedWords = StringEscapeUtils.escapeHtml(normalWords);
  9. System.out.println("escape " + normalWords +" 的結果是: " + escapedWords);
  10. String unescapedWords = StringEscapeUtils.unescapeHtml(escapedWords);
  11. System.out.println("unescape 回來的結果是: " + unescapedWords);
  12. System.out.println();

  13. // 測試 html 特殊符號的 escape 和 unescape
  14. // 輸入的符號為:& < > "
  15. String htmlCodes = "&<>\"";
  16. System.out.println("測試 html 特殊符號的 escape 和 unescape");
  17. String escapedhtmlCodes = StringEscapeUtils.escapeHtml(htmlCodes);
  18. System.out.println("escape " + htmlCodes +" 的結果是: " + escapedhtmlCodes);
  19. String unescapedhtmlCodes = StringEscapeUtils.unescapeHtml(escapedhtmlCodes);
  20. System.out.println("unescape 回來的結果是: " + unescapedhtmlCodes);
  21. }
  22. }
其輸出結果為:
  1. 測試純文字的 escape 和 unescape
  2. escape 測試文字 的結果是: &#28204;&#35430;&#25991;&#23383;
  3. unescape 回來的結果是: 測試文字

  4. 測試 html 特殊符號的 escape 和 unescape
  5. escape &<>" 的結果是: &amp;&lt;&gt;&quot;
  6. unescape 回來的結果是: &<>"
由以上知我們可以用 StringEscapeUtils 輕易轉換 html 的碼,
而且 StringEscapeUtils 也還有針對其他格式的轉換,如 xml、javascript、java、csv。
詳細的說明可見:StringEscapeUtils 的 API
或是等我之後有用到再來寫說明囉。

關鍵字:StringEscapeUtils, Apache, html, escape, unescape
參考資料:
  1. http://commons.apache.org/lang/
  2. StringEscapeUtils
  3. StringEscapeUtils 的 API
  4. 編碼 - Java
  5. HTML Purifier in Java:HTMLInputFilter


更多精選推薦文章

0 意見 :