[ZF]Convert file CSV lỗi font tiếng Nhật

Đi onsite cho đối tác Nhật mới biết bên đó họ dùng những công nghệ khá cổ, tuy nhiên mức độ mượt thì không phải nghĩ.

Đây là trường hợp mình gặp phải khi làm việc với Zend Framework 1 của đối tác Nhật, hoặc áp dụng đối với bất cứ project nào của các bạn dùng PHP cũng có thể áp dụng được.

Một chút kinh nghiệm của mình muốn note lên đây để lưu trữ lại sau này có thể sẽ dùng tới, hoặc bạn nào đang gặp phải vấn đề tương tự cũng có thể tham khảo.

Vấn đề gặp phải:
+ File .csv của khách hàng Nhật export từ hệ thống khác gửi cho mình đọc trên máy bình thường, không có vấn đề gì cả.

+ Mình dùng hàm fopen để mở file lên và đọc thì thấy lỗi font tòe loe, đến đây thì không thể insert vào DB cái đống text lỗi này được.

Sau khi tìm hiểu và tham khảo sự trợ giúp của cao thủ tiền bối thì vấn đề: Phải convert file trước khi đọc, và đây là code mà mình sử dụng

Hàm này có chức năng convert file:

public function getFileReaderUTF8($target_file){
        $current_locale = setlocale(LC_ALL, '0'); // Backup current locale.

        setlocale(LC_ALL, 'ja_JP.UTF-8');

        // Read the file content in SJIS-Win.
        $content = file_get_contents($target_file);

        // Convert file content to SJIS-Win.
        $content = mb_convert_encoding($content, "UTF-8", "SJIS-win");

        // Save the file as UTF-8 in a temp location.
        $fp = tmpfile();

        fwrite($fp, $content);
        rewind($fp);

        setlocale(LC_ALL, $current_locale); // Restore the backed-up locale.

        return $fp;

        
    }

Và đây là hàm xử lý dữ liệu sau khi convert

public function qaAnswerCommentAction(){
        define('PUBLIC_PATH', '/opt/lampp/htdocs/cs2/public');
        $file_name = 'お礼ログ_sample.csv';
        $file = PUBLIC_PATH.'/asset/daiwa/'. $file_name;
        if (!file_exists($file)) {
            echo "File is not Exits";exit;
        }
        $fp = $this->getFileReaderUTF8($file); // Ex: "~/data.csv"
        $db = AX_Db_Table::getDefaultAdapter();
        $db->beginTransaction();        
        try {
            $countError = 0;
            $countSuccess = 0;           

            $row = 1;
            while (($record = fgetcsv($fp)) !== FALSE) 
            {
                $num = count($record);

                if($row==1){
                   $row++; 
                   continue;
                }
                $insert = QaAnswerComments::getInstance()->createRow();
                for ($c=0; $c < $num; $c++) {
                    $cm = $record[13];                  
                    $insert->user_id = $record[1];
                    $insert->qa_answer_id = $record[3];
                    $insert->created = $record[10];
                    $insert->comment = $cm;
                }
                $countSuccess++;
                $insert->save();
            }
            fclose($fp);
            $db->commit();
            echo 'Done: '.$countSuccess;exit;
        }
        catch(Exception $e) {
            $db->rollBack();
            Logger::debugLogCli('error!!' . date( 'Y-m-d h:i:s' ));
            Logger::debugLogCli($e);
        }
    }

 

Leave a comment

Your email address will not be published. Required fields are marked *