##原由 这几天工做上须要跟另外一个同事联调rest接口,我这边是java他是php,返回报文是json格式。接口调用成功后,输出返回的报文中有相似“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528 ”的Unicode字符,有点纳闷,记得java是会自动转换Unicode字符为中文才对。php
经过断点debug一看,发现返回的报文在程序中被转换为“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528”,两个反斜杠表示字符‘\’,因此输出的不是Unicode对应的中文,而是“像Unicode”的字符串了。java
##解决方案 只要把获得的报文中的“\”换成“\”,我想就能正常地将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("\\","\")天然没效果了。apache
后来在StackOverFlow上找到一个忽略转义的工具类, org.apache.commons.lang.StringEscapeUtils ,里面有忽略各类语言的转义符号的方法,既好用也便于理解,就直接拿来用了。
其中unescapeJava(String s)方法是来处理java转义字符的,能够将字符串中的 “\”转换为 “\”,“'”转换为“'”等。经过这个方法处理以上字符串,恰好可以知足个人需求。json
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); } } }