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

起因

    这几天工作上需要跟另一个同事联调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()方法处理转义字符的相关源码,便于理解。

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://www.cnblogs.com/davidwang456/p/4580786.html

java中如何忽略字符串中的转义字符--转载相关推荐

  1. Java:判断一个字符串中是否存在另一个字符子串以及判断一个字符串中是否存在指定字符

    Java:判断一个字符串中包含指定字符子串,判断一个字符串中存在指定字符 字符串的contains方法可以判断一个字符串中是否存在另一个字符子串,示例如下 String Str = "Hel ...

  2. java利用正则截取字符串中的数字

    java利用正则截取字符串中的数字 String str = "xxx第47297章33";String regex = "\\d*";Pattern p = ...

  3. python字符串转义序列_Python | 忽略字符串中的转义序列

    python字符串转义序列 First see, how escape sequence works? 首先看,转义序列如何工作? In the below example, we are using ...

  4. java如何使截取字符串_java中如何截取字符串中的指定一部分

    java中如何截取字符串中的指定一部分 关注:136  答案:4  mip版 解决时间 2021-02-06 13:27 提问者妳涐執唸汰深 2021-02-06 08:56 精选 比如 F:\wor ...

  5. java 汉字个数_java语言中如何获取字符串中汉字的个数

    java语言中如何获取字符串中汉字的个数? [实例描述] 字符串中可以包含数字,字母.汉字或者其他字符.使用Character 类的isDigit()方法可以判断字符中的某个字符是否为数字,使用Cha ...

  6. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  7. java中把一个字符串中大写字母转换为小写,小写字母转换为大写

    java中把一个字符串中大写字母转换为小写,小写字母转换为大写 观看提示: 这里提供2中思维,但是第一种是正确的,第二种是错误的:第二种的思维可以了解了解,但是需要注意的是如果某个字符串定义为Stri ...

  8. java取出字符串中的后四位_[原]Java面试题-将字符串中数字提取出来排序后输出...

    [Title][原]Java面试题-将字符串中数字提取出来排序后输出 [Date]2013-09-15 [Abstract]很简单的面试题,要求现场在纸上写出来. [Keywords]面试.Java. ...

  9. java 工具类-去除字符串中特殊字符、全角转为半脚、获取字符串中姓名/电话、姓名重复后追加a.b.c...aa,ab..

    java 工具类-去除字符串中特殊字符.全角转为半脚.获取字符串中姓名/电话.姓名重复后追加a.b.c-aa,ab- public class NameUtil {/*** 姓名重复后追加a.b.c. ...

最新文章

  1. 汇总|基于3D点云的深度学习方法
  2. 宝塔mysql优化_宝塔面板下实现MySQL性能优化处理
  3. hdu 1881 毕业bg
  4. c高级语言程序设计B试题,高级语言程序设计试题(B)卷.doc
  5. spark pineline流水线+聚类评估函数 小结
  6. tab+easyui datagrid无法正常显示
  7. sql integer字置为空_请写一个函数来检查用户提交的数据是否为整数
  8. 11111111111111111111
  9. zabbix监控系统--详细安装教程
  10. 计算机表格如何求和,excel表格怎么求和? excel自动求和的三种方法
  11. 浏览器主页被修改的解决方案
  12. 冰雪之冠上的明珠与东方明珠 辉映在黄浦江两岸
  13. java graphics2d旋转_反转Java Graphics2D缩放和旋转坐标
  14. CHAPTER 11 Syntactic Parsing
  15. MATLAB函数汇总
  16. win7 两台PC网线直连创建家庭组局域网分享文件
  17. UISwitch - 开关按钮 的使用详解
  18. 行业新宠倔强的尾巴首登亚宠展,朝云集团迅速布局宠物市场
  19. 如何设计可靠性UDP传输协议?
  20. c++类与对象(多文件编程!)(编写一个有关股票的程序,其中有两个类:一个是深圳类shen_stock,另一个是上海类shang_stock。)

热门文章

  1. oracle 重做日志内容,Oracle重做日志文件基础
  2. java xsl生成word文件_导出生成xsl文件
  3. qt布局嵌套_PyQt5 笔记(01):嵌套布局
  4. 环状同步造成的死锁问题
  5. 信息检索报告_读者信息素养状况问卷调查分析报告来啦
  6. 北京数码视讯s905l固件_神州数码与MAXHUB构建更紧密的伙伴关系,共同开启可持续发展之旅...
  7. 判断sem信号量为零_Linux系统编程——进程同步与互斥:System V 信号量
  8. Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受
  9. 复随机变量及高斯熵的概念
  10. Leetcode 234 回文链表 (每日一题 20210730)