在处理网页时经常会遇到这样的问题,后台得到的字符串数据包含网页HTML中的特殊字符,例如在页面上这样一句话,“你好·世界”在后台取到的是“你好·世界”。这是由于HTML对特殊字符进行了编码。

今天在取得前台form表单提交的数据时,就遇到了这样的问题。页面表单填的数据是正常的字符串“你好·世界”,传到后台以后却把·这个字符进行了编码,变成了·

之前在做爬虫时处理这种问题通常是进行简单的替换,类似这样

String escaped = source.replace("<", "&lt;").replace("&", "&amp;");

但是考虑到用户进行表单提交可能有很多种情况的特殊字符,一一列举各种特殊字符的情况再进行replace非常繁琐。而这种字符串问题也很常见,应该有成熟的工具包可以对其进行处理。

google之后,果然没让我失望,这个工具就在apache的commons.lang包之中,是StringEscapeUtils工具类。

处理上述问题,只需要在后台java代码中进行如下处理即可。

String escaped = StringEscapeUtilssource.unescapeHtml(source);

escaped中的值就是正常的字符串“你好·世界”。


StringEscapeUtils中还提供了许多其他的方法,比如escapeCsv/unescapeCsv,escapeJava/unescapeJava,escapeJavaScript/unescapeJavaScript等等,类似escapeHtml/unescapeHtml,方便对字符串其他情况的处理。escapeHtml指的是将字符串进行编码,unescapeHtml表示不编码也就是显示原始字符串。


真的要感谢造轮子的前人,使我们更方便地解决问题。我们也应该更充分得用好轮子,提高效率。有机会也去造轮子。也希望有一天随着技术不断发展,轮子已经完善到不需要用我们这种用轮子的人^_^


好吧,不瞎扯了,再说句相关的题外话,spring中也提供htmlEscape功能,可以用 <spring:htmlEscape>和<spring:escapeBody>标签;也可以在spring form的input标签中添加属性htmlEscape="false",完整方式如下

<form:input path="title" htmlEscape="false"/>

更详细的请查阅spring相关文档。


参考链接:

http://stackoverflow.com/questions/1265282/recommended-method-for-escaping-html-in-java