公司内部使用的feed程序读取本地文件存入DB时出现大量乱码问题,虽然qa/stage/live三套环境无论是DB编码配置,还是服务器系统编码都是相同的,却出现十分诡异的问题——qa/stage环境不能复现live的乱码问题。最终boss要求做一个程序监控,评估问题的情况以及后续跟踪bug是否真正修复。此问题最终证明root cause是使用getBytes()与new String(byte[], charset)的错误,即两者使用的charset不一致。值得记录的是监控程序

通过删除所有合法字符,留下非法字符的方式过滤出符合条件的记录

    List<String> invalidContent = new ArrayList<String>();
    String value;

    for (Entry<String, String> entry : getBodies(ids).entrySet()) {
      /**
       * &thinsp;--\\u2009
       * &lrm;--\\u200E
       */
      value = entry.getValue().replaceAll("[\\u0000-\\u05FF\\u2009\\u200E]", "");
      if (!"".equals(value)) {
        invalidContent.add(entry.getKey());
        log.error(entry.getKey() + ":" + value);
      }

    }

使用正则的unicode区间参考

http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF
http://en.wikibooks.org/wiki/Unicode/Character_reference/F000-FFFF

 posted on 2014-05-07 22:21  hiv  阅读(184)  评论(0编辑  收藏  举报