php解析文档(日语)编码问题

博客讲述了在使用PHPExcel处理日文CSV文件时遇到的编码问题和解决方案。作者尝试了设置不同的输入编码,但导致了数据乱码或异常。最终通过文件内容的编码转换和自定义CSV解析方法实现了正确解析,但这种方法对于可能变化的报表格式不够稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导入日文CSV数据表,开始使用的是 PHPExcel导入

    $objReader = \PHPExcel_IOFactory::createReader('CSV')
        ->setDelimiter(',')
        //->setInputEncoding('GBK')
        ->setEnclosure('"')
        //->setLineEnding("\r\n")
        ->setSheetIndex(0);

    $objPHPExcel = $objReader->load($file);
    $file_datas = $objPHPExcel->getSheet()->toArray();
    结果: 获取数据失败,抛出异常 "Trying to access array offset on value of type bool".


尝试着设置编码: 
    
    objReader->setInputEncoding('GBK');
    $objPHPExcel = $objReader->load($file);
    $file_datas = $objPHPExcel->getSheet()->toArray();

    结果: 数据可以获取,但是数据内容乱码并且数据列也不正确.
    
    
文档内容编码转换,再使用 PHPExcel 读取:

    $JP_file = $file.'_JP';
    if(!file_exists($JP_file)) {
        $content = file_get_contents($file);
        $re = mb_convert_encoding($content, 'utf-8', 'JIS, eucjp-win, sjis-win,shift-jis,utf-8');
        file_put_contents($JP_file,$re);
    }
    $file = $JP_file;

    $objReader = \PHPExcel_IOFactory::createReader('CSV')
        ->setDelimiter(',')
        //->setInputEncoding('GBK')
        ->setEnclosure('"')
        //->setLineEnding("\r\n")
        ->setSheetIndex(0);

    $objPHPExcel = $objReader->load($file);
    $file_datas = $objPHPExcel->getSheet()->toArray();

    结果: 转出编码没问题,但是数据并没有理想输出。部份列数据没有对应
    
    
文档内容编码转换,自定义解析csv内容: 
    
    $JP_file = $file.'_JP';
    if(!file_exists($JP_file)) {
        $content = file_get_contents($file);
        $re = mb_convert_encoding($content, 'utf-8', 'JIS, eucjp-win, sjis-win,shift-jis,utf-8');
        file_put_contents($JP_file,$re);
    }
    $file = $JP_file;
    if (($handle = fopen($file, "r")) !== FALSE) {
        //解析方式不稳写
        while (($row_str = fgets($handle, 4096)) !== FALSE) {
            $_str = trim($row_str,"\"");
            $_str = str_replace('"
','',$_str);
            $_str = str_replace('",,"','","","',$_str);
            $_d = explode('","',trim($_str));
            $file_datas[] = $_d;
        }
        fclose($handle);
    }
    if(!isset($file_datas[7])) {
        throw new \Exception('文档解析异常,没有找到正常的文档标题',2200030002);
    }
    
    结果: 
    输出内容编码正确,数据结果也正确,但是业务代码处理并不稳定,
    我们这是对亚马逊报表进行解析,也可能报表格式有变化那么这里的解析代码就会出现异常,所以还需要找稳定的解决方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值