专栏首页代码人生unicode字符串解析

unicode字符串解析

现象和答案

在http接口接收时,很多接口提供方都喜欢把汉字通过unicode的方式传过来,而数字和字母保持不变,就像这样。

{“Content”:"[reply]CocoWu892[/reply]\n\u6c9f\u901a\u662f\u6700\u91cd\u8981\u7684\u6280\u80fd\u4e4b\u4e00"}

这里就必须涉及到一个带unicode字符串转成正常字符串的过程。网上关于这块问题有很多博客,大部分都是一样的,实现思路是在字符串中找到\n[0-9]{4}字符串,并将匹配到的四位数字通过Integer.parseInt()来转成字符串。我认为一定有开源jar完成了这个工作,我们应该不用自造轮子。经过寻找,发现fastjson能自动的转换unicode字符串。

fastjson,已经实现unicode字符串解析,JSON.parseObject(String)等方法都可以。

实现原理,fastjson实现过程,自造轮子

接下来内容是具体实现,实现方式原理和fastjson的实现方式。

我们先了解一下unicode码,unicode码\u8981\u是标示,告诉你这是一个unicode码,8981是码的内容,是16位数字,根据8981在unicode码库中找到对应字符。\在string中的字符实际是\\8981可以通过(char)Integer.parseInt("8981",16)来转码。

在fastjson中,unicode的解析在JSONLexerBase.scanString()。fastjson字符串(遍历),发现当前字符是"时,便执行该方法。scanString()方法内容如下,遍历之后的字符,如果是,跳出循环;如果是\\进入特殊字符解析,比如\",\n,\u之类,如果是\u便开始unicode解析。

ch = next();
switch (ch) {
  case ...
  
  case 'u':
    char u1 = ch = next();
    char u2 = ch = next();
    char u3 = ch = next();
    char u4 = ch = next();
    int val = Integer.parseInt(new String(new char[] { u1, u2, u3, u4 }), 16);
    putChar((char) val);
    break;
}

如果仅仅做一个unicode解析,可以使用正则进行匹配和替换,这是自造轮子,仿的String.replaceAll();

    public String parseString(String content) {
        String unicodeRegix = "\\\\u(.{4})";
        Pattern pattern = Pattern.compile(unicodeRegix);
        Matcher matcher = pattern.matcher(content);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String result = matcher.group(1);
            int val = Integer.valueOf(result,16);
            matcher.appendReplacement(sb, "" + (char) val);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

调用和结果

    @Test
    public void parseString() {
        UnicodeUtil unicodeUtil = new UnicodeUtil();
        System.out.println(unicodeUtil.parseString("{\"Content\":\"[reply]CocoWu892[\\/reply]\\n\\u6c9f\\u901a\\u662f" +
                "\\u6700\\u91cd\\u8981\\u7684\\u6280\\u80fd\\u4e4b\\u4e00\"}"));
    }

Connected to the target VM, address: ‘127.0.0.1:60255’, transport: ‘socket’ {“Content”:"[reply]CocoWu892[/reply]\n沟通是最重要的技能之一"}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • webservices系列(五)——javaweb整合Axis2及多service配置

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • CSDN用户行为分析和用户行为数据爬取

    爬虫随机从CSDN博客取得800条用户行为数据,包含用户名、原创博客数、评论数、浏览量,试着从博客数,评论数,浏览量三个方面分析csdn的博主们的形象。

    逝兮诚
  • JAVA自动爬取CSDN用户数据并文章点赞

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • 「观点」微软OneDrive推“新政”,好棋还是烂棋?

    镁客网
  • 2017年关于深度学习的十大预测

    Carlos E. Perez对深度学习的2017年十大预测,让我们不妨看一看。有兴趣的话,可以在一年之后回顾这篇文章,看看这十大预测有多少准确命中:) ? 1...

    智能算法
  • 2017年终总结:秋招心路历程+安卓/java知识总结Android 知识点总结Java知识点总结

    一直想写一篇年终总结的,但是又不知道写点什么,感觉没有什么可总结的,但是今年有很多事情还是值得回顾纪念的,之后再来看这些东西应该会感触颇多。2017对我来说是值...

    牛客网
  • 波士顿机器人升级,端茶倒水开门样样精通 | 热点

    镁客网
  • Java 学习路线之四个阶段

    写这篇总结,主要是记录下自己的学习经历,算是自己对知识的一个回顾。也给想要学习 Java 的提供一些参考,对于一些想要学习Java,又不知道从哪里下手,以及现在...

    前端博客 : alili.tech
  • Entity Framework Feature CTP 5系列文章

    12月份发布了Entity Framework Feature CTP 5,这也是最后一个CTP版本了,明确了RTM的发布时间是2011年Q1,CTP5主要是加...

    张善友
  • 2018年将要轰动世界的三大神科技

    一、AR技术 在智能手机出现的10年前,大部分人都会觉得盯着看手机5个小时肯定是不可能的事。不过在2018年,低头族可能都要抬起头来了。 ? 手机游戏 Pok...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券