记录下这次因为一个隐藏的字符而导致的艰辛历程哈~
原由:客户反馈,某导出功能有出现乱码现象,经过自己敏锐的程序员目光,一查看,发现是多余的乱码,
看了导出工具的编码,设置的Excel的编码均为UTF-8,果断确认,不是两边的编码格式问题了~
下一步:查看数据库,肉眼看数据库没有多余的空格问题,数据正确,但是编辑下字符内容重新导出发
现,bug没有了,复制MySQL的数据到Excel中,显现出隐藏问题的原形了,如以下图所示:
数据库看: 粘贴到Excel:
后面了解到这是特殊的字符导致的:Unicode编码的一种---也叫"零宽字符",字面意思就是不占用字
节的字符,这就是为什么我们在数据中看不到它的存在,但是他导出来或者粘贴在文本里就可以看得到.
第一步:使用正则表达式去除Unicode编码,发现依然有空格
执行结果如下:
发现执行结果中依然有空格,于是使用trim()方法发现并没有效果,后面发现trim()只适用于清除半角
空格,不适用于全角空格,但是转换成半角后依然么有,这依然是个特殊的空格字符,重新导出的Excel
中发现:
是个方块框乱码字符,
于是直接使用
replace("把代码中的空格直接复制粘贴到这里","输入半全角空格")后再使用trim()方法
成功的解决了这个问题.
执行结果如下:
具体代码如下:
//正常的两个字
String a="赵丽";
//有Unicode编码的字
String b="赵丽︀ \u200D\u202D︀ \u200C︀ \u200C \u200C\u200D\u202D︀ \u200C\u200C\u200E︀ \u202D\u200D";
//使用正则表达式去除Unicode编码
String regex = "([\\u007f-\\u009f]|\\u00ad|[\\u0483-\\u0489]|[\\u200A-\\u200F]|[\\u0559-\\u055a]|\\u058a|[\\u0591-\\u05bd]|\\u05bf|[\\u05c1-\\u05c2]|[\\u05c4-\\u05c7]|[\\u0606-\\u060a]|[\\u063b-\\u063f]|\\u0674|[\\u06e5-\\u06e6]|\\u070f|[\\u076e-\\u077f]|\\u0a51|\\u0a75|\\u0b44|[\\u0b62-\\u0b63]|[\\u0c62-\\u0c63]|[\\u0ce2-\\u0ce3]|[\\u0d62-\\u0d63]|\\u135f|[\\u200b-\\u200f]|[\\u2028-\\u202e]|\\u2044|\\u2071|[\\uf701-\\uf70e]|[\\uf710-\\uf71a]|\\ufb1e|[\\ufc5e-\\ufc62]|\\ufeff|\\ufffc)";
// 匹配Unicode编码的正则表达式
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(b);
String output = matcher.replaceAll("");
System.out.println("正常字符串:" + a);
System.out.println("正常字符串长度:" + a.length());
System.out.println("打印下有Unicode编码的长度:" + b);
System.out.println("清除不可见字符后的字符串:" + output.replace("︀"," ").trim());
System.out.println("清除不可见字符后的字符串长度:" + output.replace("︀"," ").trim().length());
写在最后:
遇到困难不要放弃,一定要坚持到最后,相信你一定会有所成长,因为困难是你进步的阶梯.
原本自己也打算放弃,想着每天给他修数据算了,后面发现不行,这是个问题,我得抓住这一次成长的
机会,一次不行就再来一次,一天不行就再来一天,终于,在我的坚持下,迎来了胜利的曙光!~你也要加
油!程序员的道路艰苦而又漫长,克服一次又一次的困难,终会迎来更好的自己!