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

编程知识 更新时间:2023-04-06 17:17:21

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.apachemons.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);

}

}

}

更多推荐

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

本文发布于:2023-04-06 17:17:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/724de0ff2cdb9265d41b2231a29d56c9.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   字符   java   _java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 50094文章数
  • 14阅读数
  • 0评论数