公司内部使用的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()) { /** *  --\\u2009 * ‎--\\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
原文:http://www.cnblogs.com/hiver/p/3714827.html