JAVA中MySQL数据复制(导出)到Excel中数据乱码问题

记录下这次因为一个隐藏的字符而导致的艰辛历程哈~

原由:客户反馈,某导出功能有出现乱码现象,经过自己敏锐的程序员目光,一查看,发现是多余的乱码,

看了导出工具的编码,设置的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());

 写在最后:

遇到困难不要放弃,一定要坚持到最后,相信你一定会有所成长,因为困难是你进步的阶梯.

原本自己也打算放弃,想着每天给他修数据算了,后面发现不行,这是个问题,我得抓住这一次成长的

机会,一次不行就再来一次,一天不行就再来一天,终于,在我的坚持下,迎来了胜利的曙光!~你也要加

油!程序员的道路艰苦而又漫长,克服一次又一次的困难,终会迎来更好的自己!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值