将HTML中的特殊字符转化为可显示的字符

4 篇文章 0 订阅

很多时候丛网页中抽取的内容中都含有很多特殊的转义字符,网页中显示的要么是实体名称,要么是实体编码,如

显示说明实体名称实体编号

半方大的空白  

全方大的空白  

不断行的空白格  
<小于&lt;&#60;
>大于&gt;&#62;
&&符号&amp;&#38;
"双引号&quot;&#34;
©版权&copy;&#169;
®已注册商标&reg;&#174;
商标(美国)&#8482;
×乘号&times;&#215;
÷除号&divide;&#247;

这里有前人写好的,将实体编码转化为可显示字符的代码:Java的HTML的URL字符编码转换为Java字符串的函数 | 中文Flex例子原理是根据实体编码中的数字,得到对应的字符。但上述方法不支持将实体名称转化为可显示字符,如能将"&#34;"转化为双引号,却不能识别"&quot;"。这次没有固定的规律,只能自己作映射了。比较折中的做法是转化如下几个常见的:

&gt;>
&quot;"
&nbsp 
&apos;
修改后的代码如下:

/**
 * 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 part
			mat.appendReplacement(sb, mbChar);
		}
		mat.appendTail(sb);
		return new String(sb);
	}

	/* worker method */
	static String getMbCharStr(String digits) { // handle "12525" part which is
												// a
		char[] cha = new char[1]; // Unicode value stringnized
		try {
			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&#39;s War in North America"));
	}
}


比较全的编码表参见:常用HTML转义字符,html转义符,JavaScript转义符,html转义字符表,HTML语言特殊字符对照表(ISO Latin-1字符集) 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值