word导入中的一个乱码

原创
2014/03/10 14:22
阅读数 188

    在做一个题库的项目中,需要将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:如果有大神知道这个乱码的来由,能够告诉鄙人,真是感激不尽!



展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部