很多時候叢網頁中抽取的內容中都含有很多特殊的逸出字元,網頁中顯示的要麼是實體名稱,要麼是實體編碼,如
| 顯示 |
說明 |
實體名稱 |
實體編號 |
|
半方大的空白 |
  |
  |
|
全方大的空白 |
  |
  |
|
不斷行的空白欄框 |
|
  |
| < |
小於 |
< |
< |
| > |
大於 |
> |
> |
| & |
&符號 |
& |
& |
| " |
雙引號 |
" |
" |
|
著作權 |
© |
© |
|
登入商標 |
® |
® |
|
商標(美國) |
|
™ |
| × |
乘號 |
× |
× |
| ÷ |
除號 |
÷ |
÷ |
這裡有前人寫好的,將實體編碼轉化為可顯示字元的代碼:Java的HTML的URL字元編碼轉換為Java字串的函數 | 中文Flex例子。原理是根據實體編碼中的數字,得到對應的字元。但上述方法不支援將實體名稱轉化為可顯示字元,如能將"""轉化為雙引號,卻不能識別"""。這次沒有固定的規律,只能自己作映射了。比較折中的做法是轉化如下幾個常見的:
| > |
> |
| " |
" |
|   |
|
| ' |
‘ |
修改後的代碼如下:
/** * Convert HTML character enitities(Unicode) to part of a Java String */import java.util.regex.*;public class UnicodeCeToJavaString {static final String mbs = "&#(\\d+);"; // like "ロ"public static String EncodeCesToChars(String paramStr) {paramStr = paramStr.replace("&","&") .replace("<","<") .replace(">",">") .replace(""","\"") .replace(" "," ") .replace("'","'");String mbChar;StringBuffer sb = new StringBuffer();Pattern pat = Pattern.compile(mbs);Matcher mat = pat.matcher(paramStr);while (mat.find()) {mbChar = getMbCharStr(mat.group(1)); // pass the digit partmat.appendReplacement(sb, mbChar);}mat.appendTail(sb);return new String(sb);}/* worker method */static String getMbCharStr(String digits) { // handle "12525" part which is// achar[] cha = new char[1]; // Unicode value stringnizedtry {int val = Integer.parseInt(digits);char ch = (char) val;cha[0] = ch;} catch (Exception e) {System.err.println("Error from getMbCharStr:");e.printStackTrace(System.err);}return new String(cha); // easy!, because Java uses Unicode}public static void main(String[] args) {System.out.println(UnicodeCeToJavaString.EncodeCesToChars("George's War in North America"));}}
比較全的編碼錶參見:常用HTML逸出字元,html轉義符,JavaScript轉義符,html逸出字元表,HTML語言特殊字元對照表(ISO Latin-1字元集) 。