java中如何忽略字符串中的转义字符'\'

java中如何忽略字符串中的转义字符''

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

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

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

public String replaceAll( String regex,String replacement)  ;

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

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

public class Test(){

	public static void main(String[] args) {
		String s = "\\u79fb\\u52a8\\u4e92\\u8054\\u7f51\\u5e94\\u7528";
		String s2 = StringEscapeUtils.unescapeJava(s);
		System.out.println(s);
		System.out.println(s2);

	}

}

输出结果:  
\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528
移动互联网应用
```````

    附上unescapeJava()方法处理转义字符的相关源码,便于理解。
```````````java
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);
		}

	}
}

转载于:https://my.oschina.net/u/1010578/blog/366252

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值