2019独角兽企业重金招聘Python工程师标准>>>
在做一个题库的项目中,需要将word中的试题导入到数据库中,中间过程真是坎坷,且不说word中的公式,图片等等格式,还有凌乱的排版,还有一些不明觉厉的乱码;
由于PHP暂时不能胜任,所以使用了C#开发了一个客户端来导入,时间很急,只是用了一个星期,bug不由分说便是很多;木有办法,也木有时间,由于C#操作数据库不是很熟,只是连接数据库来检查了一下一些试题中知识点啊等等是否规范,导入和创建关联数据还是交给了PHP来实现,毕竟要操作十几张数据表-_-||;
过程基本是这样的,word=>json=>PHP添加到数据库,表格和公式转为图片,json中存图片的hash(也作为文件名,后来发现并不合理);
好了,背景交代完毕,还有很多的崎岖过程也就不再详述,进入正题,这个乱码,乱码只有一个,在网页中显示成了小方格,猜测是word的段落结束控制符,没有细究;在段落结尾都会有一个,一开始的时候,我立马想到使用正则,但是怎么都匹配不到,我反其道而行,匹配不是汉字数字等等正常字符的,误杀率很高;
这时候我想到了PHP的mbstring,这货支持的字符集很全,我也没有再使用正则,使用ord发现值是238(就是这货:î不知道是神马,项目使用的是utf-8的编码),我只好用了一下杀招,干掉了这货;
function cutLast($field){mb_internal_encoding('UTF-8');$char = chr(238);$currPos = mb_strpos($field,$char);if($currPos == false){return $field;} $length = mb_strlen($field);$temp = ''; while($length!=0){if($currPos!=false){ $temp .= mb_substr($field,0,$currPos);if($currPos>=$length-1){break;}$field = mb_substr($field,++$currPos,$length-$currPos);$length = mb_strlen($field);}else{ $temp .= $field;break;} $currPos = mb_strpos($field,$char); }$field = $temp;unset($temp,$currPos,$length);return $field;}
函数名叫做cutLast其实段落中间也有,但主要是段落最后;也可以过滤点段落中间的;
测试了几遍,找调用接口的同事在模版上加上了这个函数,木有问题,才考虑在数据库中跑一遍过滤掉,乱码不见了真是让人说不出的爽啊;
PS:如果有大神知道这个乱码的来由,能够告诉鄙人,真是感激不尽!