JSON

HTML、JS、JSON特殊字符

字号+ 作者:H5之家 来源:H5之家 2016-09-03 16:02 我要评论( )

从服务器端以JSON格式将数据传递到客户端后,通过JS显示在HTML页面时,有一些特殊字符不能直接显示

技术库:tec.5lulu.com

目录

1 JS到HTML特殊字符转换

from:tec.5lulu.com

       用JSTL标签显示不转义的字符:<c:out value="<%=nickname %>" escapeXml="false"/>

       发现从服务器端以JSON格式将数据传递到客户端后,通过JS显示在HTML页面时,有一些特殊字符不能直接显示,如后台传递过来的是 '<b>msg</b>&nbsp;&#35;' 通过JS显示在HTML页面中时,显示成了msg # ,并不是<b>msg</b>&nbsp;&#35;,这是由于<与>之间的内容看作是HTML标签了,而以&开头的&nbsp;与&#35;为HTML实体,所以显示不正常。

       解决办法很简单,在JS将其渲染到HTML页面前转换一下即可:

<html> <body> <div ></div> <div ></div> <script > var str = '<b>msg</b>&nbsp;&#35;'; document.all.div1.innerHTML='<pre>'+str+'</pre>'; //js中的字符串正常显示在HTML页面中 String.prototype.displayHtml= function(){ //将字符串转换成数组 var strArr = this.split(''); //HTML页面特殊字符显示,空格本质不是,但多个空格时浏览器默认只显示一个,所以替换 var htmlChar="&<>"; for(var i = 0; i< str.length;i++){ //查找是否含有特殊的HTML字符 if(htmlChar.indexOf(str.charAt(i)) !=-1){ //如果存在,则将它们转换成对应的HTML实体 switch (str.charAt(i)) { case '<': strArr.splice(i,1,'&#60;'); break; case '>': strArr.splice(i,1,'&#62;'); break; case '&': strArr.splice(i,1,'&#38;'); } } } return strArr.join(''); } alert(str.displayHtml()); document.all.div2.innerHTML=str.displayHtml(); </script> </body> </html>

       上面在赋给div之前没有转换,所以显示不正常,第二个div显示正常,显示结果如下:

2 JSP到HTML特殊字符转换

       以上是通过JS将后台传递过来的数据显示在页面之前的转换,有时是通过JSP生成HTML页面内容,此时的特殊字符会比上面多,另外此时的转换需要通过服务器端转换后再输出到HTML页面。如 jsp页面在生成HTML时如下:

<input type='txt' value='<%=msg %>'>

       如果 msg 为 I'am> 时,第一页面会乱,第二文本框中显示的值不正确 。这是由于HTML标签属性值可以使用双引号也可使用单引号,如果HTML使用的是单引号,而值中也包含单引号时,就会出现问题,双引号同样也有这样的问题,由于大都数情况下,页面中属性使用双引号还是单引号没有规范下来,所以服务器端传递来的单引号与双引号都需要转换。另外像<、>就不用说了,也是需要转换的,所以此种情况下应该至少<>"'& 这5个需要特殊转换。

// HTML字符转换表 public final static Map<String, String> HTML_CHAR = new HashMap<String, String>(); static { HTML_CHAR.put("&", "&#38;"); HTML_CHAR.put(""", "&#34;"); HTML_CHAR.put("<", "&#60;"); HTML_CHAR.put(">", "&#62;"); HTML_CHAR.put("'", "&#39;"); } public static final StringBuilder toHTMLChar(String str) { if (str == null) { return new StringBuilder(); } StringBuilder sb = new StringBuilder(str); char tempChar; String tempStr; for (int i = 0; i < sb.length(); i++) { tempChar = sb.charAt(i); if (HTML_CHAR.containsKey(Character.toString(tempChar))) { tempStr = (String) HTML_CHAR.get(Character .toString(tempChar)); sb.replace(i, i + 1, tempStr); i += tempStr.length() - 1; } } return sb; }

       在输出到HTML之前使用上面的toHTMLChar(msg).toString()转换一下即可:

3 Java到JSON特殊字符转换

       由于从服务器后端生成JSON格式的字符串,最后传递到客户端由 eval() 函数动态的生成,如果JSON字符串格式错误,则eval解析会出错,经常也是最常出错的是" ' rn  这三个字符,如 {name:'I'am'}解析时会出错,同样,由于中的字符串可由单引号也可由双引号引起来,所以双引号一样也有这样问题。另外,字符串是不能跨行写的,即你不能写成这样:{name:"I'

am"}

       所以这3个需要转换,另外换行可能依赖于平台,所以 n 也需要转换,比如我们需要将后台抛出的异常栈信息以JSON的格式传回到浏览器上显示时,就需要将回车换行转换。代码如下:

response.setContentType("application/json"); Writer wr = response.getWriter(); if(exceptionTrace.indexOf("'")!=-1){ //将单引号转义一下,因为JSON串中的字符串类型可以单引号引起来的 exceptionTrace = exceptionTrace.replaceAll("'", "\'"); } if(exceptionTrace.indexOf(""")!=-1){ //将双引号转义一下,因为JSON串中的字符串类型可以单引号引起来的 exceptionTrace = exceptionTrace.replaceAll(""", "\""); } if(exceptionTrace.indexOf("rn")!=-1){ //将回车换行转换一下,因为JSON串中字符串不能出现显式的回车换行 exceptionTrace = exceptionTrace.replaceAll("rn", "\u000d\u000a"); } if(exceptionTrace.indexOf("n")!=-1){ //将换行转换一下,因为JSON串中字符串不能出现显式的换行 exceptionTrace = exceptionTrace.replaceAll("n", "\u000a"); } wr.write("{success:false,exception:true,msg:'" +exceptionTrace + "'}"); wr.flush(); wr.close(); 4 最常用的字符实体(Character Entities)

显示结果 说明 Entity Name Entity Number

显示一个空格 &nbsp; &#160;

< 小于 &lt; &#60;

> 大于 &gt; &#62;

& &符号 &amp; &#38;

" 双引号 &quot; &#34;

5 其他常用的字符实体(Character Entities)

显示结果 说明 Entity Name Entity Number

© 版权 &copy; &#169;

® 注册商标 &reg; &#174;

× 乘号 &times; &#215;

÷ 除号 &divide; &#247;

HTML、JS、本文链接

我来评分 :7

已经成功评论!

1

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • json-lib的使用《二》,json-lib《二》

    json-lib的使用《二》,json-lib《二》

    2016-09-01 16:01

  • FusionCharts--加载json文件

    FusionCharts--加载json文件

    2016-07-30 18:01

  • iOS开发技巧系列---打造强大的BaseModel

    iOS开发技巧系列---打造强大的BaseModel

    2016-07-21 18:01

  • C# web api返回类型设置为json的两种方法

    C# web api返回类型设置为json的两种方法

    2016-05-20 18:00

网友点评
c