zoukankan      html  css  js  c++  java
  • PHP导入文件的转码问题

    今天在公司的做的后天项目出现点问题,本以为全开发完了,但是在联调的过程中我发现了很严重的问题,这个问题困扰了我好久,后来才知道原因,归根结底就是经验不足,以前做过,踩过坑就好了。

    我导出的文件是csv格式的,有的同学就会问为什么不是excel格式的,emmmm,我的导师跟我说csv文件比较小,而且是以逗号分隔的,用记事本就可以打开,比较好处理。我做的后台也需要导入功能,导入的也是csv文件,如果要导入execl文件的话会很麻烦,需要用到一个插件,而且excel处理速度比加慢,幸好我们的库里有封装好的。我的bug出现在导出文件如果不许改可以正常导入,但是一经修改再次导入的话就会出现乱码,后来才发现是Excel或wps自动把文件转码了,转成了GBK码,而我需要的是UTF-8的,这时就需要先把接收的文件转码了。

    常见的转码方式:

    1.iconv — 字符串按要求的字符编码来转换 
    iconv有bug ,碰到一些生僻字就会无法转换,当然了配置第二个参数时,可以稍微弥补一下默认缺陷,不至于无法转换是截断,用法如下 
    iconv(“UTF-8″,”GB2312//IGNORE”,$data) ; 

    2.mb_convert_encoding详解: 
    为了确保转换的成功率,我们可以用另一个转换函数 
    mb_convert_encoding,这个函数效率不是很高,另外这个函数还可以省略第三个参数,自动识别内容编码,不过最好不要用,影响效率,还需要注意的时,mb_convert_encoding和iconv参数顺序不一样,一定要注意。$outstr = mb_convert_encoding($instr,'UTF-8','GBK');   

    3.mb_detect_encoding详解:

    mb_detect_encoding — 检测字符的编码

    4.将任意码转换成utf

    1 private function characet($data){
    2         if( !empty($data) ){
    3             $fileType = mb_detect_encoding($data , array('UTF-8','GBK','LATIN1','BIG5','ASCII','GB2312')) ;
    4             if( $fileType != 'UTF-8'){
    5                 $data = mb_convert_encoding($data ,'utf-8' , $fileType);
    6             }
    7         }
    8         return $data;
    9     }

    注意:一定要在用字符串分割函数之前就行转码。

    我还遇到时间格式的问题,同样是csv和excel的坑,导出的时间格式是1978-12-23 08:08:08 ,但是给我转码成了1978/12/23 8:08:08 ,这问题的解决办法就是把前端给的参数用函数strtotime转换成时间戳,再用date函数转换成想要的格式就好了,很坑吧。。。。。

    今天很烦。。。。。。

  • 相关阅读:
    day 66 ORM django 简介
    day 65 HTTP协议 Web框架的原理 服务器程序和应用程序
    jQuery的事件绑定和解绑 事件委托 轮播实现 jQuery的ajax jQuery补充
    background 超链接导航栏案例 定位
    继承性和层叠性 权重 盒模型 padding(内边距) border(边框) margin 标准文档流 块级元素和行内元素
    属性选择器 伪类选择器 伪元素选择器 浮动
    css的导入方式 基础选择器 高级选择器
    03-body标签中相关标签
    Java使用内存映射实现大文件的上传
    正则表达式
  • 原文地址:https://www.cnblogs.com/yjb333/p/9339110.html
Copyright © 2011-2022 走看看