专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 移动开发

java中怎么忽略字符串中的转义字符-转载

发布时间:2010-05-29 22:27:48 文章来源:www.iduyao.cn 采编人员:星星草
java中如何忽略字符串中的转义字符--转载

 

原文地址:http://my.oschina.net/u/1010578/blog/366252

起因

    这几天工作上需要跟另一个同事联调rest接口,我这边是java他是php,返回报文是json格式。接口调用成功后,输出返回的报文中有类似“u79fbu52a8u4e92u8054u7f51u5e94u7528 ”的Unicode字符,有点纳闷,记得java是会自动转换Unicode字符为中文才对。

    通过断点debug一看,发现返回的报文在程序中被转换为“u79fbu52a8u4e92u8054u7f51u5e94u7528”,两个反斜杠表示字符‘’,所以输出的不是Unicode对应的中文,而是“像Unicode”的字符串了。

解决方案

    只要把得到的报文中的“”换成“”,我想就能正常地将Unicode输出成中文了,首先想到的是使用字符串的replaceAll()方法。使用replaceAll(““,““),但是发现输出结果没有任何变化。 
查了下API文档,replaceAll()方法的定义是:

public String replaceAll( String regex,String replacement)  ;

    也就是第一个参数指的是正则表达式,所以“”用正则表达式的方式来看,匹配的是字符串中的两个字符,而不是java中的‘’转义符。换句话说,就是regex参数作为正则表达式查找的源字符串是已经转义过的“u79fbu52a8u4e92u8054u7f51u5e94u7528”,而不是转义前的“u79fbu52a8u4e92u8054u7f51u5e94u7528”,所以replaceAll(““,““)自然没效果了。

    后来在StackOverFlow上找到一个忽略转义的工具类, org.apache.commons.lang.StringEscapeUtils ,里面有忽略各种语言的转义符号的方法,既好用也便于理解,就直接拿来用了。 
其中unescapeJava(String s)方法是来处理java转义字符的,可以将字符串中的 “”转换为 “”,“'”转换为“'”等。通过这个方法处理以上字符串,刚好能够满足我的需求。

public class Test(){

    public static void main(String[] args) {
        String s = "u79fbu52a8u4e92u8054u7f51u5e94u7528";
        String s2 = StringEscapeUtils.unescapeJava(s);
        System.out.println(s);
        System.out.println(s2);

    }

}

输出结果:  
u79fbu52a8u4e92u8054u7f51u5e94u7528
移动互联网应用

    附上unescapeJava()方法处理转义字符的相关源码,便于理解。

public static void unescapeJava(Writer out, String str) throws IOException {
    if(out == null) {
        throw new IllegalArgumentException("The Writer must not be null");
    } else if(str != null) {
        int sz = str.length();
        StrBuilder unicode = new StrBuilder(4);
        boolean hadSlash = false;
        boolean inUnicode = false;

        for(int i = 0; i < sz; ++i) {
            char ch = str.charAt(i);
            if(inUnicode) {
                unicode.append(ch);
                if(unicode.length() == 4) {
                    try {
                        int nfe = Integer.parseInt(unicode.toString(), 16);
                        out.write((char)nfe);
                        unicode.setLength(0);
                        inUnicode = false;
                        hadSlash = false;
                    } catch (NumberFormatException var9) {
                        throw new NestableRuntimeException("Unable to parse unicode value: " + unicode, var9);
                    }
                }
            } else if(hadSlash) {
                hadSlash = false;
                switch(ch) {
                    case '"':
                        out.write(34);
                        break;
                    case ''':
                        out.write(39);
                        break;
                    case '':
                        out.write(92);
                        break;
                    case 'b':
                        out.write(8);
                        break;
                    case 'f':
                        out.write(12);
                        break;
                    case 'n':
                        out.write(10);
                        break;
                    case 'r':
                        out.write(13);
                        break;
                    case 't':
                        out.write(9);
                        break;
                    case 'u':
                        inUnicode = true;
                        break;
                    default:
                        out.write(ch);
                }
            } else if(ch == 92) {
                hadSlash = true;
            } else {
                out.write(ch);
            }
        }

        if(hadSlash) {
            out.write(92);
        }

    }
}
 
 
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: