我们都知道,在html中遇到>、<、空格等字符显示处理是会将其转为>、<、 来展示使用,以便兼容和不影响既有页面的html代码里的成对标签的正常加载,与之相同的还有:
字符 | 转义字符 |
---|---|
" | " |
& | & |
< | < |
> | > |
不断开空格(non-breaking space) |
等等... ...
那么我们就会遇到如下业务场景,比如我们通过后台获取到的页面值为转义后>、<等, 而实际我们需要是>和<,这是我们就需要通过一个Java的类做下转义处理。
//import org.springframework.web.util.HtmlUtils;
String sourceStr = "> <";
System.out.println("原始 sourceStr = " + sourceStr);
//将转义后的html解析成原本的值
String targetStr = HtmlUtils.htmlUnescape(sourceStr);
System.out.println("目标 targetStr = " + targetStr );
输出结果:
原始 sourceStr = > <
目标 targetStr = > <
反过来我们也可以将这些特殊字符转以后返回给相应业务接口。
//import org.springframework.web.util.HtmlUtils;
String sourceStr = "> <";
System.out.println("原始 sourceStr = " + sourceStr);
//将特殊字符进行转义处理
String targetStr = HtmlUtils.htmlEscape(sourceStr);
System.out.println("目标 targetStr = " + targetStr );
输出结果:
原始 sourceStr = > <
目标 targetStr = > <
同理,针对java的一些特殊字符串的转义处理与上面项目,区别在与所用的到类和方式为:StringEscapeUtils。
转义字符 |
意义 |
\b |
退格(BS) ,将当前位置移到前一列 |
\f |
换页(FF),将当前位置移到下页开头 |
\n |
换行(LF) ,将当前位置移到下一行开头 |
\r |
回车(CR) ,将当前位置移到本行开头 |
\t |
水平制表(HT) (跳到下一个TAB位置) |
\v |
垂直制表(VT) |
\\ |
代表一个反斜线字符''\' |
\' |
代表一个单引号(撇号)字符 |
\" |
代表一个双引号字符 |
\? | 代表一个问号 |
\0 |
空字符(NULL) |
\ddd |
1到3位八进制数所代表的任意字符 |
\xhh |
1到2位十六进制所代表的任意字符 |
等等... ...
针对以上Java特殊字符的转义,我们通过下面的方法进行处理。
//import org.apache.commons.lang.StringEscapeUtils;
String sourceStr = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\":\\\'123456\\\'}";
System.out.println("原始 sourceStr = " + sourceStr);
String targetStr = StringEscapeUtils.unescapeJava(sourceStr);
System.out.println("目标 targetStr = " + targetStr);
输出结果:
原始 targetStr = {\"name\":\"spy\",\"id\":'123456'}
目标 sourceStr = {"name":"spy","id":'123456'}
反过来我们也可以将这些特殊字符转以后返回给相应业务接口。
//import org.apache.commons.lang.StringEscapeUtils;
String sourceStr = "{\"name\":\"spy\",\"id\":\'123456\'}";
System.out.println("原始 sourceStr = " + sourceStr);
String targetStr = StringEscapeUtils.escapeJava(sourceStr);
System.out.println("目标 targetStr = " + targetStr);
输出结果:
原始 sourceStr = {"name":"spy","id":'123456'}
目标 targetStr = {\"name\":\"spy\",\"id\":'123456'}
PS:当然我们也可以通过String.replace、replaceAll等进行手动处理。
写完这个笔记保存时发现,CSDN也不能正常保存标题中包含的<和>等特殊字符,转义后>和<有原样显示了,看,这就是应用场景!