【转义处理】Json和XML的特殊字符转义处理

14 篇文章 1 订阅

0.背景

一般在使用接口传输数据时通常会使用两种数据交换格式:JSON、XML。json通常用于前后端交互,xml可通过命名空间和规范check tag的层次关系,都可以很好地与对象互相转换。但是由于有的字符在格式上被用了,字段内容如果包含这些特殊字符需要进行转义!

1.XML特殊字符

xml的特殊字符 包括< > & "

标签内容特殊转义后
<&lt;
>&gt;
&&amp;
"&quot;
/**
     * 过滤要输出到xml的字符串,将<,>,&,"进行转义输出
     *
     * @param input
     * @return
     */
    public static String filterXMLString(String input) {
        if (input == null) {
            return EMPTY_STRING;
        }
        int length = input.length();
        StringBuilder result = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            char c = input.charAt(i);
            switch (c) {
                case '<': {
                    result.append("&lt;");
                    break;
                }
                case '>': {
                    result.append("&gt;");
                    break;
                }
                case '\"': {
                    result.append("&quot;");
                    break;
                }
                case '&': {
                    result.append("&amp;");
                    break;
                }
                default: {
                    result.append(c);
                }
            }
        }
        return result.toString();
    }

    @Test
    public void testXMLEscape(){
        String str = "Posco P&S Tower < > & \"" ;
        System.out.println(StringUtil.filterXMLString(str)); //Posco P&amp;S Tower &lt; &gt; &amp; &quot;

    }

1.Json特殊字符

json 只有有69个:*+-./@_0-9a-zA-Z 不需要转码 ,算术加减乘除 4个,.小数点、@、 _下划线、数字10个、大小写26个字母 26*2 

4+1+1+1+10+26*2=69

类型个数
数字0-910
小数点.1
加减乘除+-*/4
大小写字母 a-z A-Z52
@1
_1
总计69

其余的字符都需要进行转码,如果在拉丁字符,就直接转ASCII编码%hex[ch]

如果非拉丁,则转unicode编码%uhex[(ch >>> 8)]hex[(0x00FF & ch)

/** 
     * 编码,模拟js的escape函数.<br> 
     * escape不编码字符有69个:*+-./@_0-9a-zA-Z 
     *  
     * @param s 
     *            字符串 
     * @return 转义后的字符串或者null 
     */
    public static String escape(String s) {
        if (s == null) {
            return null;
        }
        StringBuffer sbuf = new StringBuffer();
        int len = s.length();
        for (int i = 0; i < len; i++) {
            int ch = s.charAt(i);
            if ('A' <= ch && ch <= 'Z') {
                sbuf.append((char) ch);
            } else if ('a' <= ch && ch <= 'z') {
                sbuf.append((char) ch);
            } else if ('0' <= ch && ch <= '9') {
                sbuf.append((char) ch);
            } else if (ch == '*' || ch == '+' || ch == '-' || ch == '/' || ch == '_' || ch == '.'
                       || ch == '@') {
                sbuf.append((char) ch);
            } else if (ch <= 0x007F) {
                sbuf.append('%');
                sbuf.append(hex[ch]);
            } else {
                sbuf.append('%');
                sbuf.append('u');
                sbuf.append(hex[(ch >>> 8)]);
                sbuf.append(hex[(0x00FF & ch)]);
            }
        }
        return sbuf.toString();
    }

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值